为什么在飞镖中将两个double相乘会导致非常奇怪的数字

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

有人能解释为什么结果是252.99999999999997而不是253吗?应该使用什么代替253?

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

我基本上是试图将2位小数(即2.11英镑)的货币值转换为便士/分(即211p)谢谢

dart int double
1个回答
2
投票

简而言之:因为许多分数双精度值不精确,所以加上不精确的值可能会得出更加不精确的结果。这是IEEE-754浮点数的固有属性,这是Dart(以及大多数其他语言和运行它们的CPU)所使用的。

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

2.11的值正好是2.109999999999999879875655021241982467472553253173173125125。0.42的值正好是0.419999999999999984484456877655247808434069156646728515625。如您所见,两者都比您想要的值稍小。

然后您将这两个值相加,得到精确的double结果2.529999999999999804600747665972448885440826416015625。这会使0.42的最后几位数字丢失而无法取整,并且由于两者都已经小于2.11和0.42,因此结果现在甚至小于2.53。最后,将其乘以100,即可得出精确的结果252.9999999999999999971578290569595992565155029296875。

与双精度值253.0不同。

double.toString方法不会返回确切值的字符串,但是会针对不同的值返回不同的字符串,并且由于该值不同于253.0,因此它必须返回不同的字符串。然后,它返回一个shortest编号的字符串,该字符串与下一个相邻的double值相比仍然更接近结果,这就是您看到的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.