gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:12:22 25 4
gpt4 key购买 nike

谁能解释为什么结果是252.99999999999997而不是253?用什么代替253?

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

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

最佳答案

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

有理数2.11和0.42都不能精确表示为double值。当您将2.11编写为源代码时,其含义是最接近数学数字2.11的实际double值。
2.11的值正好是2.10999999999999987565565124124467467553553173173828125。0.42的值正好是0.419999999999999984484456877655247808434069156646728515625。
如您所见,两者均比您预期的值略小。

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

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

关于dart - 为什么在 Dart 中将两个double相乘会导致非常奇怪的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58834678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com