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
。
如果我尝试打印
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
。