PHP整数舍入问题

PHP整数舍入问题,php,floating-point,integer,Php,Floating Point,Integer,echo(int)((0.1+0.7)*10) 为什么上面的输出是7?我理解PHP是如何向0进发的,但(0.1+0.7)*10是否作为浮点值计算,然后再转换为整数 谢谢 我没有安装php,但在python中: $ python >>> 0.1+0.7 0.79999999999999993 >>> 并非以10为基数的所有数字都能在以2为基数的系统中精确表示。查看维基百科文章: 二进制的部分分数。特别是,这一行: Fraction Decimal

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

为什么上面的输出是7?我理解PHP是如何向0进发的,但
(0.1+0.7)*10是否作为浮点值计算,然后再转换为整数


谢谢

我没有安装php,但在python中:

$ python
>>> 0.1+0.7
0.79999999999999993
>>> 
并非以10为基数的所有数字都能在以2为基数的系统中精确表示。查看维基百科文章:

二进制的部分分数。特别是,这一行:

Fraction    Decimal     Binary  Fractional Approx.
1/10    0.1     0.000110011...  1/16+1/32+1/256...

1/10不能在基数2中以有限的方式表示。因此,0.1+0.7无法在基数2中精确计算


永远不要假设浮点计算是精确的,它迟早会咬到你。

当小数在内部转换为二进制等价物时,精度会下降。计算出的值大约为7.9+,而不是预期的8

如果需要高精度,请使用函数系列或库。

请参阅手册:

这是典型的简单十进制 不能使用0.1或0.7之类的分数 转换为它们的内部二进制文件 没有小损失的同行 精确这可能导致混淆 结果:例如, 地板((0.1+0.7)*10)通常 返回7而不是预期的8, 因为内部代表将 大概是7.9


1/10不能用有限数量的二进制数字表示,就像1/3不能用有限数量的10进制数字表示一样。因此,实际上是将0.0999999999相加。。。和0.699999999…——总数几乎是8,但不完全是。

其他答案解释了为什么会发生这种情况。这会让你得到你想要的:

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

在将浮点数转换为整数之前,只需对浮点数进行四舍五入。

另外,建议您不要实际使用浮点数进行货币计算,因为这种精度损失我认为这种情况在任何语言中都会发生,这是因为浮点数在内部的处理方式