有人可以解释一下这里发生了什么吗?
echo (18.99 * 100); // output: 1899
echo (int)(18.99 * 100); // output: 1898
我唯一能想到的是,1899实际上是1898.999999999999或其他东西而且PHP正在以某种方式将其转换为echo
的一部分?如果是这样的话,为什么呢?如果没有,这种奇怪行为的原因是什么?
答案 0 :(得分:6)
来自手册:
从float转换为整数时,数字将四舍五入为零。
如果float超出整数(usually +/- 2.15e+9 = 2^31 on 32-bit platforms and +/- 9.22e+18 = 2^63 on 64-bit platforms)
的边界,则结果是未定义的,因为float没有足够的精度来给出精确的整数结果。发生这种情况时,不会发出警告,甚至不会发出通知!
警告强>
永远不要将未知分数转换为整数,因为这有时会导致意外结果。
<?php
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
?>
此外,基本10中的浮点数精确表示的有理数,如0.1或0.7,没有精确表示为基数2中的浮点数,无论尾数的大小如何,它都在内部使用。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,,因为内部表示将类似于7.9999999999999991118 ....
在您的情况下,可能是18.99*100=1898.999999999999772626324556767940521240234375
,因此int
会将其截断为1898年。