PHP 奇怪的浮点不精确

PHP Strange Floating Point Imprecision

如果我尝试打印

echo ((0.1 + 0.7) * 10);

输出 (http://codepad.org/m3mNNO77)

8

但是如果我尝试打印

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

输出 (http://codepad.org/8OTCnlVG)

7

为什么会有两个不同的结果?

如果您在没有 (int) 转换的情况下执行 echo,结果为:

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

所以浮点数实际上表示为 7.99999....

当您执行 (int) 转换时,默认行为是取整数部分,即 7。虽然已经极其接近8,但不是一个演员要四舍五入的行为

错误是由于浮点数是用二进制基数表示的。因此 不可能 正确表示 0.8。浮点数完善了答案,希望它不会那么麻烦。当你表示像 0.8 这样的浮点数时,结果是 0.80000...

概念验证 使用 PHP 交互式 shell (php -a):

$ php -a
Interactive mode enabled

php > echo number_format(((0.1 + 0.7) * 10),20)."\n";
7.99999999999999911182
php > echo number_format(0.8,20);
0.80000000000000004441

如您所知,由于表示形式的限制,浮点数学并不精确。

(0.1 + 0.7) * 10 可以得出类似 7.99999999999....

的结果

echo 输出时,使用 舍入 将数字转换为字符串,它使用 php.ini precision 设置(我相信默认情况下是 15)来限制小数位数。碰巧这个舍入恰好给出 8.

但是,(int) 将浮点数转换为整数,这是通过截断完成的。无论您与下一个整数有多接近,它都会 总是 向下舍入。这就是为什么你在这里得到 7