【问题标题】:Dart/Flutter check if value is an integer/whole numberDart/Flutter 检查值是否为整数/整数
【发布时间】:2023-03-18 04:33:02
【问题描述】:

如何检查一个值是整数(整数)还是包含小数?在 Javascript 中,我们有 isInteger,但我在 Dart 中找不到等价物。

我们似乎检查了isEvenisOddisFiniteisInfiniteisNaNisNegative,但没有检查isInteger

【问题讨论】:

  • 仍然没有在 Flutter 中实际工作的有效答案。

标签: flutter dart integer


【解决方案1】:

飞镖数字(num 类型)是整数(int 类型)或双精度数(double 类型)。

很容易检查一个数字是否为int,只需执行value is int

稍微困难的任务是检查double 值是否具有整数值,或者没有小数部分。没有简单的函数可以回答这个问题,但您可以使用value == value.roundToDouble()。这将从double 值中删除任何小数部分并将其与原始值进行比较。如果它们相同,则没有小数部分。

所以,辅助函数可以是:

bool isInteger(num value) => 
    value is int || value == value.roundToDouble();

我使用roundToDouble() 而不仅仅是round(),因为后者也会将值转换为整数,这可能会为较大的双精度值提供一个不同的值。

【讨论】:

  • 这实际上 确实 工作,不像其他答案。虽然我认为这将是 Dart 的一部分。由于它的 isOdd、is Even 等功能较少,因此检查起来更简单。
  • @lrn 使用truncateToDouble会不会比使用roundToDouble简单一点?
  • 我很惊讶似乎没有等效于 C 的 modf 来提取 double 的整数和小数部分。
  • 您使用truncateToDoubleroundToDoublefloorToDoubleceilToDouble 中的哪一个无关紧要,性能除外。 roundToDouble 似乎确实比 VM 上的其他三个要慢,而 roundToDoubletruncateToDouble 在编译为 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
【解决方案2】:

使用模运算符 %:

  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

【讨论】:

  • 我不确定这与其他人相比的速度,但我发现模运算符的方式更容易理解。我认为这涉及到偏好。但是,我会避免在本机对象上使用扩展方法,因为扩展会导致更多混乱并且难以确定它们的来源。相反,我会创建一个辅助类来处理称为数学之类的数字
【解决方案3】:
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
  • 我没有在 Flutter 中得到这个,那是哪个版本的 Dart?你在 Flutter 中检查它吗?
  • 我认为您应该删除您的答案,因为已确认它在 Dart 中不起作用。它不会验证整数,因此会误导其他人看到您的答案。它确实在 Dartpad 中工作,因为 Dartpad 编译为 javascript,但它不能像我们在 Flutter 中看到的那样在实际的 Dart 代码中工作。
【解决方案4】:

我这样做了,效果很好:

bool _isInteger(double value) => value == value.toInt();

方法toInt()去掉了小数部分,所以如果去掉这部分后没有任何变化,则表示它是一个整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 2011-08-13
    • 2023-03-14
    相关资源
    最近更新 更多