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

问题描述 投票:0回答:3

我随机选择了两个

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 floating-point double floating-accuracy
3个回答
6
投票

就我而言,其原因是浮点运算以及 Dart 使用 IEEE 754 标准这一事实。

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

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


1
投票

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
投票

一个简单的解决方案是:

  • 取决于您期望的小数位数(假设 2,您可以使其更通用......)
  • ((a * 100).toInt() - (b * 100)).toInt() / 100
    .
© www.soinside.com 2019 - 2024. All rights reserved.