【发布时间】:2023-03-18 04:33:02
【问题描述】:
如何检查一个值是整数(整数)还是包含小数?在 Javascript 中,我们有 isInteger,但我在 Dart 中找不到等价物。
我们似乎检查了isEven、isOdd、isFinite、isInfinite、isNaN 和isNegative,但没有检查isInteger?
【问题讨论】:
-
仍然没有在 Flutter 中实际工作的有效答案。
如何检查一个值是整数(整数)还是包含小数?在 Javascript 中,我们有 isInteger,但我在 Dart 中找不到等价物。
我们似乎检查了isEven、isOdd、isFinite、isInfinite、isNaN 和isNegative,但没有检查isInteger?
【问题讨论】:
飞镖数字(num 类型)是整数(int 类型)或双精度数(double 类型)。
很容易检查一个数字是否为int,只需执行value is int。
稍微困难的任务是检查double 值是否具有整数值,或者没有小数部分。没有简单的函数可以回答这个问题,但您可以使用value == value.roundToDouble()。这将从double 值中删除任何小数部分并将其与原始值进行比较。如果它们相同,则没有小数部分。
所以,辅助函数可以是:
bool isInteger(num value) =>
value is int || value == value.roundToDouble();
我使用roundToDouble() 而不仅仅是round(),因为后者也会将值转换为整数,这可能会为较大的双精度值提供一个不同的值。
【讨论】:
truncateToDouble会不会比使用roundToDouble简单一点?
modf 来提取 double 的整数和小数部分。
truncateToDouble、roundToDouble、floorToDouble 或ceilToDouble 中的哪一个无关紧要,性能除外。 roundToDouble 似乎确实比 VM 上的其他三个要慢,而 roundToDouble 和 truncateToDouble 在编译为 JS 并在 Chrome 中运行时都较慢。除非我知道这是我的应用程序的瓶颈(然后我也会检查其他浏览器),否则我不会在意。
1 is int 将适用于 Native 和 Web。然而,1 is double 实际上会返回 false 对于 Native 和 true 对于 Web!而1.0 is int 将返回true 用于Web!似乎 Dart 的制造者真的不希望你使用这个成语,因为他们不保证结果匹配所有平台。我不建议这样做,因为将来可能会更改。 dart.dev/guides/language/numbers
使用模运算符 %:
bool isInteger(num value) => (value % 1) == 0;
与扩展方法相同:
extension NumExtensions on num {
bool get isInt => (this % 1) == 0;
}
用法:
double d = 2.6;
double d2 = 2.0;
int i = 2;
print(d.isInt); // returns false
print(d2.isInt); // returns true
print(i.isInt); // returns true
【讨论】:
void main() {
int a = 10;
print(a is int); // Prints true
}
或
void main() {
dynamic a = 10;
print(a is int ? a/10 :"Not an int"); // Prints 1
}
【讨论】:
print((2 + 2) is int); = 真,print((2 / 2) is int); = 假??
print((2 / 2) is int); 和 print((2 + 2) is int); 都打印 true
我这样做了,效果很好:
bool _isInteger(double value) => value == value.toInt();
方法toInt()去掉了小数部分,所以如果去掉这部分后没有任何变化,则表示它是一个整数。
【讨论】: