PHP中奇怪的数字转换错误

And*_*ris 3 php floating-point

结果怎么样?

intval("19.90"*100)
Run Code Online (Sandbox Code Playgroud)

1989
Run Code Online (Sandbox Code Playgroud)

而不是1990人们所期望的(PHP 5.2.14)?

Art*_*cto 13

这是因为19.90在基数2中不能完全表示,最接近的近似值略低于19.90.

也就是说,这个最接近的近似值恰好是2 ^ -48×0x13E66666666666.如果您有兴趣,可以在这里以小数形式查看其确切值.

当你乘以100时intval会传播这个舍入误差.将强制浮点数转换为整数,这样的转换总是向0 舍入,这就是你看到的原因1989.请round改用.