Eva*_*Eva 7 php rounding typecast-operator
有人可以解释一下这里发生了什么吗?
echo (18.99 * 100); // output: 1899
echo (int)(18.99 * 100); // output: 1898
Run Code Online (Sandbox Code Playgroud)
我唯一可以想到的是,1899实际上是1898.999999999999或其他东西,PHP正在转换它作为echo某种程度的一部分?如果是这样的话,为什么呢?如果没有,这种奇怪行为的原因是什么?
来自手册:
从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!
?>
Run Code Online (Sandbox Code Playgroud)
另外,可以精确表示为基数10中的浮点数的有理数,如0.1或0.7,不具有精确表示为基数2中的浮点数,其在内部使用,无论尾数的大小.因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物.这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)*10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....
你的情况可能会 18.99*100=1898.999999999999772626324556767940521240234375因此int它截断至1898年.
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |