PHP中的舍入

PHP中的舍入,php,floating-point,floating-accuracy,Php,Floating Point,Floating Accuracy,PHP返回false 谁能解释一下为什么会这样? 第一个返回8,第二个返回7。 编辑 $a=((0.1+0.7)*10)=8; var_dump($a); 回声“”; 定义(“精度”,1.0e-08); $a=(绝对值((0.1+0.7)*10)-8

PHP返回false

谁能解释一下为什么会这样? 第一个返回8,第二个返回7。

编辑

$a=((0.1+0.7)*10)=8;
var_dump($a);
回声“
”; 定义(“精度”,1.0e-08); $a=(绝对值((0.1+0.7)*10)-8<精度); var_dump($a);
浮点运算不精确。你可以得到7.999而不是8.0。。。当转换为整数时,它会被截断为7

$a = ((0.1 + 0.7) * 10) == 8;
var_dump($a);

echo '<br />';

define('PRECISION', 1.0e-08);

$a = (abs(((0.1 + 0.7) * 10) - 8) < PRECISION);
var_dump($a);
结果:

echo number_format((0.1 + 0.7) * 10, 20);

因为对浮点数的运算不是100%准确,所以在从表达式中转换值之前,可能会出现类似于7.9999…

的情况,引用:

典型的情况是,像
0.1
0.7
这样的简单小数不能转换为其内部二进制对应项,而不会有小的精度损失。这可能会导致混乱的结果:例如,
floor((0.1+0.7)*10)
通常会返回
7
,而不是预期的
8
,因为内部表示类似于
7.9

这是因为不可能用有限位数的十进制表示法来表示某些分数。例如,十进制形式的
1/3
变为
0.3

因此,永远不要相信最后一位的浮点数结果,也不要比较浮点数是否相等。如果需要更高的精度,并且功能可用


Mark的回答一针见血,但我认为您不需要使用圆形PHP函数,而需要使用圆形PHP函数:

来自(单击以获取详细说明):

因为在内部,计算机使用 格式(二进制浮点)为 不能准确地表示一个数字 比如0.1、0.2或0.3

当代码被编译或 已解释,您的“0.1”已 四舍五入到该表中最接近的数字 格式,这将导致 舍入误差甚至在 计算发生了


您可以通过以下方式进行比较:

7.99999999999999911182

var_转储((0.1+0.7)*10)没有帮助四舍五入到
float(8)
以获得输出。如果你想深入研究长答案:也可以看看我的文章(特别参见程序2)。(这基本上只是以下答案中描述的现象的更多细节,尽管是在不同的上下文中)。特别是,只有分数可以用
p/q
的形式表示,其中
q
是2的整数幂,
p
是任何整数,可以用有限的位精确表示。
7.99999999999999911182
$a = round(((0.1 + 0.7) * 10), 1) == (int)round(((0.1 + 0.7) * 10), 1);