2011-08-17 68 views
2

有谁知道为什么floor(61681) = 61681,但是floor(616.81*100) = 61680PHP楼层功能

我已经尝试了许多其他值一样

floor(716.81*100) = 71681 
floor(816.81*100) = 81681 
floor(916.81*100) = 91681 
floor(616.83*100) = 61683 

任何人都知道为什么会这样?

回答

7

由于二进制浮点数的性质,会发生内部舍入误差。没有办法将616.81精确地表示为二进制浮点数 - 其最接近的近似值实际上略小于616.81。但是,61681可以完全表示。

616.81表示由100相乘,结果比61681少一点点,因此要求它floor将返回61680

http://codepad.org/H0wh2itg

如果你要绝对精确,你可以使用PHP的BC数学函数,它可以为你需要的性能为代价的精确。例如:

var_dump(floor(bcmul(616.18, 100, 12))); 
+0

请仔细阅读我的回答。二进制浮点数的本质固有的内部舍入不准确性。这意味着不可能精确地表示一些数字,例如'616.81'。另外,由于codepad.org在真正的PHP解释器上运行代码,我用它作为证明。请解除您的失望,因为我的回答是正确的。 –

+0

那么为什么我的PHP显示61681? http://sandbox.phpcode.eu/g/bb5f9.php – genesis

+1

因为打印浮点数字的例程不打印确切的内部表示,而是显示一个四舍五入的数字以显示您可能期望的内容。我建议你阅读http://floating-point-gui.de/ –