我随机选择了两个
double
数字:
double a = 7918.52;
double b = 5000.00;
我希望从
2918.52
得到 a - b
。2918.5200000000004
,这看起来很奇怪。
print(a - b); // -> 2918.5200000000004
但是如果我将
double a
更改为7918.54
,我将得到2918.54
的预期结果。
有人可以向我解释为什么某些
double
值会导致意外的舍入问题而其他值则不会吗?
就我而言,其原因是浮点运算以及 Dart 使用 IEEE 754 标准这一事实。
所有使用浮点运算的语言都会发生这种情况。您可以阅读有关其他编程语言的类似问题。
现代编程语言中关于浮点运算的一般问题。
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 时,你才会得到显示的结果,但我怀疑它永远不会成为你的用例。
一个简单的解决方案是:
((a * 100).toInt() - (b * 100)).toInt() / 100
.