Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.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
PHP奇怪的浮点不精确_Php - Fatal编程技术网

PHP奇怪的浮点不精确

PHP奇怪的浮点不精确,php,Php,如果我尝试打印 echo ((0.1 + 0.7) * 10); echo (int)((0.1 + 0.7) * 10); 输出 但如果我试着打印 echo ((0.1 + 0.7) * 10); echo (int)((0.1 + 0.7) * 10); 输出 为什么会有两种不同的结果?如果在没有int cast的情况下执行echo,则会导致: echo ((0.1 + 0.7) * 10); 8 所以发生的是,浮点实际上表示为7.99999 当您执行整型转换时,默认行为是接受整型

如果我尝试打印

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

但如果我试着打印

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

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

如果在没有int cast的情况下执行echo,则会导致:

echo ((0.1 + 0.7) * 10);
8
所以发生的是,浮点实际上表示为7.99999

当您执行整型转换时,默认行为是接受整型部分,即7。虽然它非常接近8,但这并不是一个演员的行为

这些错误是由于浮点数是用二进制基数表示的。因此,正确表示0.8是不可能的。浮点数将答案四舍五入,希望不会太麻烦。如果将浮点表示为0.8,则结果为0.80000

使用PHP交互式shell PHP-a进行概念验证:

如果在不执行int强制转换的情况下执行回显,则会导致:

echo ((0.1 + 0.7) * 10);
8
所以发生的是,浮点实际上表示为7.99999

当您执行整型转换时,默认行为是接受整型部分,即7。虽然它非常接近8,但这并不是一个演员的行为

这些错误是由于浮点数是用二进制基数表示的。因此,正确表示0.8是不可能的。浮点数将答案四舍五入,希望不会太麻烦。如果将浮点表示为0.8,则结果为0.80000

使用PHP交互式shell PHP-a进行概念验证:


正如您可能知道的,浮点数学由于其表示形式的限制而不精确

0.1+0.7*10等于7.999999999

当echo输出时,数字通过舍入转换为字符串,舍入默认使用php.ini精度设置15,我认为这是为了限制十进制数字的数量。碰巧这个四舍五入正好是8


但是,int将浮点转换为整数,这是通过截断完成的。不管你离下一个整数有多近,它总是向下取整。这就是为什么在这里得到7。

正如您可能知道的,浮点数学由于其表示形式的限制而不精确

0.1+0.7*10等于7.999999999

当echo输出时,数字通过舍入转换为字符串,舍入默认使用php.ini精度设置15,我认为这是为了限制十进制数字的数量。碰巧这个四舍五入正好是8


但是,int将浮点转换为整数,这是通过截断完成的。不管你离下一个整数有多近,它总是向下取整。这就是为什么在这里得到7。

重新打开这个问题是因为,虽然我们已经无数次地看到浮点错误,但这是一个特别有趣的边缘情况,与副本完全无关。重新打开这个问题是因为,虽然我们无数次地看到浮点错误,这是一个特别有趣的边缘案例,与副本完全无关。感谢您的回复!现在理解这个奇怪的现象。谢谢你的回复!现在,请理解这个奇怪的现象。