Dart - 减去一些双精度值会得到错误的结果

Dart - Subtracting some double values gives wrong result

提问人:Zoka 提问时间:6/16/2019 最后编辑:creativecreatorormaybenotZoka 更新时间:9/7/2023 访问量:2607

问:

我选了两个随机数:double

double a = 7918.52;
double b = 5000.00;

我希望从 .
好吧,它给了我一个结果,这似乎很奇怪。
2918.52a - b2918.5200000000004

print(a - b); // -> 2918.5200000000004

但是如果我改成 ,我会得到预期的结果。double a7918.542918.54

有人可以向我解释为什么有些值会导致意外的舍入问题而其他值则不会?double

DART 浮精度

评论

3赞 jamesdlin 6/16/2019
浮点数学是否损坏的可能重复?

答:

7赞 creativecreatorormaybenot 6/16/2019 #1

造成这种情况的原因是浮点运算,以及就我而言,Dart 使用 IEEE 754 标准的事实。

对于使用浮点运算的所有语言,都会发生这种情况。您可以阅读有关其他编程语言的类似问题

关于现代编程语言中浮点运算的一般问题

评论

0赞 Zoka 6/17/2019
谢谢。这就解释了。
1赞 Jack' 9/18/2022 #2

creativecreatorormaybenot 是对的,这是 Dart 语言本身的问题。

我想出的最好的解决方案是手动将其舍入到您期望的精度:

double substract(double a, double b, int precision) {
  return (a - b).precision(precision);
}

double precision(int fractionDigits) {
  num mod = pow(10.0, fractionDigits);
  return ((this * mod).round().toDouble() / mod);
}

如果你这样做,只有当你要求一个优于 ~12 的精度时,你才会得到你显示的结果,但我怀疑它永远不会成为你的用例。

0赞 Kowboj 12/3/2022 #3

一个简单的解决方案是:

  • 根据你期望的小数位数(假设 2,你可以让它更通用......
  • ((a * 100).toInt() - (b * 100)).toInt() / 100.