2

可能重复:
.NET 中的双倍乘法是否损坏?
浮点到 int 类型转换的 PHP 意外结果

echo (int) ( (0.1+0.7) * 10); 

给我答案 7 但不是 8。

echo (int) ( (0.1+0.8) * 10); 

给出正确的答案 9

怎么了?谁能解释

谢谢,-Navi

4

4 回答 4

2

尝试

echo (float) ( (0.1+0.7) * 10);
于 2012-09-27T14:37:37.637 回答
1

这很正常——在处理浮点数时有一种叫做精度的东西。它存在于大多数现代语言中。请参阅此处:http ://www.mredkj.com/javascript/nfbasic2.html了解更多信息。

((0.1+0.7) * 10)可能是这样7.9999999(int) 7.9999999 = 7

另一方面((0.1+0.8) * 10)可能9.00000001(int)9.00000001 = 9

浮点数的精度有限。尽管取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于在 1.11e-16 的数量级四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生更大的误差,当然,当多个运算复合时,必须考虑误差传播。

此外,可以精确表示为以 10 为底的浮点数的有理数,如 0.1 或 0.7,没有精确表示为以 2 为底的浮点数,无论尾数大小如何,它都在内部使用。因此,它们不能被转换成它们内部的二进制对应物,而不会有小的精度损失。这可能会导致令人困惑的结果:例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示将类似于 7.9999999999999991118...。

所以永远不要相信浮点数结果到最后一位,也不要直接比较浮点数是否相等。如果需要更高的精度,可以使用任意精度的数学函数和 gmp 函数。

来源: http: //php.net/manual/en/language.types.float.php

于 2012-09-27T14:33:56.173 回答
0

使用浮动

echo (float) ( (0.1+0.7) * 10); 

它会给你完美的答案

于 2012-09-27T14:37:45.000 回答
0

尝试

echo (int) round( ( (0.1+0.7) * 10));

这应该补偿浮点计算误差。

于 2012-09-27T14:57:41.993 回答