PHP整数舍入问题

时间:2010-11-21 02:36:07

标签: php floating-point integer

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

为什么以上输出7?我理解PHP如何向0舍入,但不是(0.1+0.7) * 10被评估为一个浮点数,然后作为一个整数被转换?

谢谢!

5 个答案:

答案 0 :(得分:7)

当小数内部转换为二进制等效值时,精度会有所下降。计算出的值将是7.9+而不是预期的8。

如果您需要高度准确,请使用GMP系列函数或bcmath库。

答案 1 :(得分:2)

参见手册:

http://php.net/manual/en/language.types.float.php

  

通常是简单的小数   像0.1或0.7的分数不能   转换成内部二进制文件   对手没有一点损失   精确。这可能会导致混淆   结果:例如,   通常((0.1 + 0.7)* 10)   返回7而不是预期的8,   因为内部代表会   就像7.9。

答案 2 :(得分:1)

其他答案解释了为什么会发生这种情况。这应该可以满足您的需求:

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

在将其转换为int之前,将舍入浮动。

答案 3 :(得分:0)

我没有安装php,但在python:

$ python
>>> 0.1+0.7
0.79999999999999993
>>> 

并非基数为10的所有数字都可以在base 2系统中精确表示。检查维基百科文章:

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

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

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

从不假设浮点计算是精确的,它迟早会咬你。

答案 4 :(得分:0)

1/10不能用有限数量的二进制数字表示,就像1/3不能表示为有限数量的基数为10的数字。因此,您实际上将0.09999999999999 ...和0.69999999999999加在一起... - 总和几乎 8,但不完全。