PHP楼层功能

pyy*_*yyp 2 php floating-point

有谁知道为什么floor(61681) = 61681,但是floor(616.81*100) = 61680

我尝试了很多其他的价值观

floor(716.81*100) = 71681
floor(816.81*100) = 81681
floor(916.81*100) = 91681
floor(616.83*100) = 61683
Run Code Online (Sandbox Code Playgroud)

谁知道为什么会这样?

Del*_*ani 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)));
Run Code Online (Sandbox Code Playgroud)