为什么在 dart 中将两个 double 相乘会得到非常奇怪的数字

Why multiply two double in dart result in very strange number

谁能解释为什么结果是 252.99999999999997 而不是 253?应该用什么来代替得到 253?

double x = 2.11;
double y = 0.42;
print(((x + y) * 100)); // print 252.99999999999997

我基本上是在尝试将小数点后两位的货币值(即 2.11 英镑)转换为 pence/cent(即 211p) 谢谢

简而言之:因为许多小数 double 值不精确,添加不精确的值会得到更不精确的结果。这是 IEEE-754 浮点数的固有 属性,这是 Dart(以及大多数其他语言和 CPU 运行 它们)正在使用的。

有理数 2.11 和 0.42 都不能精确表示为 double 值。当您将 2.11 编写为源代码时,其含义是最接近数学数字 2.11.

的实际 double

2.11的值正好是2.109999999999999875655021241982467472553253173828125。 0.42 的值正好是 0.419999999999999984456877655247808434069156646728515625。 如您所见,两者都略小于您想要的值。

然后将这两个值相加,得到精确的 double 结果 2.529999999999999804600747665972448885440826416015625。这会丢失 0.42 的最后几位数字以进行舍入,并且由于两者都已经小于 2.11 和 0.42,因此结果现在甚至比 2.53 还小。 最后将其乘以 100,得到精确结果 252.999999999999971578290569595992565155029296875.

这与双精度值 253.0 不同。

double.toString 方法不会 return 一个精确值的字符串,但它会 return 不同值的不同字符串,并且由于该值与 253.0 不同,它必须 return 一个不同的字符串。然后 return 是一个 最短 数字的字符串,它仍然比结果更接近下一个相邻的双精度值,这就是你看到的字符串。