2
有谁知道为什么floor(61681) = 61681
,但是floor(616.81*100) = 61680
?PHP楼层功能
我已经尝试了许多其他值一样
floor(716.81*100) = 71681
floor(816.81*100) = 81681
floor(916.81*100) = 91681
floor(616.83*100) = 61683
任何人都知道为什么会这样?
有谁知道为什么floor(61681) = 61681
,但是floor(616.81*100) = 61680
?PHP楼层功能
我已经尝试了许多其他值一样
floor(716.81*100) = 71681
floor(816.81*100) = 81681
floor(916.81*100) = 91681
floor(616.83*100) = 61683
任何人都知道为什么会这样?
由于二进制浮点数的性质,会发生内部舍入误差。没有办法将616.81
精确地表示为二进制浮点数 - 其最接近的近似值实际上略小于616.81
。但是,61681
可以完全表示。
当616.81
表示由100
相乘,结果比61681
少一点点,因此要求它floor
将返回61680
。
如果你要绝对精确,你可以使用PHP的BC数学函数,它可以为你需要的性能为代价的精确。例如:
var_dump(floor(bcmul(616.18, 100, 12)));
请仔细阅读我的回答。二进制浮点数的本质固有的内部舍入不准确性。这意味着不可能精确地表示一些数字,例如'616.81'。另外,由于codepad.org在真正的PHP解释器上运行代码,我用它作为证明。请解除您的失望,因为我的回答是正确的。 –
那么为什么我的PHP显示61681? http://sandbox.phpcode.eu/g/bb5f9.php – genesis
因为打印浮点数字的例程不打印确切的内部表示,而是显示一个四舍五入的数字以显示您可能期望的内容。我建议你阅读http://floating-point-gui.de/ –