Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么dart中的两倍相乘会产生非常奇怪的数字_Dart_Int_Double - Fatal编程技术网

为什么dart中的两倍相乘会产生非常奇怪的数字

为什么dart中的两倍相乘会产生非常奇怪的数字,dart,int,double,Dart,Int,Double,有人能解释为什么结果是252.9999999997而不是253吗?应该用什么来代替253 double x = 2.11; double y = 0.42; print(((x + y) * 100)); // print 252.99999999999997 我基本上是想把一个十进制数为2的货币值(即2.11英镑)转换成便士/美分(即211p) 谢谢简而言之:因为许多分数双精度值并不精确,添加不精确的值可能会得到更不精确的结果。这是IEEE-754浮点数的固有属性,Dart(以及大多数其他语

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

double x = 2.11;
double y = 0.42;
print(((x + y) * 100)); // print 252.99999999999997
我基本上是想把一个十进制数为2的货币值(即2.11英镑)转换成便士/美分(即211p)
谢谢

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

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

2.11
的值正好是2.10999999999875655021241982467472553253173828125。
0.42
的值正好是0.419999999998445687655247808434069156646728515625。 正如您所看到的,这两个值都略小于您想要的值

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

这与双精度值253.0不同


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

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

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

2.11
的值正好是2.10999999999875655021241982467472553253173828125。
0.42
的值正好是0.419999999998445687655247808434069156646728515625。 正如您所看到的,这两个值都略小于您想要的值

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

这与双精度值253.0不同


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

如果您处理货币,则建议您存储表示美分数的整数。如果您处理货币,则可能会重复,我建议您存储表示美分数的整数。