的PHP 7.1 intval表现怪异?

时间:2018-11-05 06:56:12

标签: php

我正在做一些计算,发现有异常的行为

这让我很头疼,因为我只想把int作为整个变量的一部分,但是在比较中,intval却刺伤了我。有什么想法为什么会这样以及我可以用来满足我的要求吗?

 intval( 9.62 * 100 ) //gives 961
    (int)( 9.62 * 100 )  // gives 962.0

我尝试达到目标的方法是:

floor(9.62 * 100)  // but its giving 962.0 no acceptable

3 个答案:

答案 0 :(得分:1)

这应该对您有用。

intval(strval( 9.62 * 100));

浮点数的精度似乎是一个问题,将数字转换为字符串然后转换为int似乎可以解决此问题。

这里是文档http://php.net/manual/en/language.types.float.php

的链接

声明为

  

此外,在底数10中可精确表示为浮点数的有理数(如0.1或0.7)在底数2中不具有作为浮点数的精确表示,内部使用,无论尾数的大小如何。因此,如果不损失一点点精度,就不能将它们转换为内部二进制副本。这可能导致混乱的结果:例如,floor((0.1 + 0.7)* 10)通常返回7而不是预期的8,因为内部表示形式类似于7.9999999999999991118。...

 echo intval((0.1 + 0.7) * 10); //returns 7
 echo intval(strval(0.1 + 0.7) * 10); //returns 8

答案 1 :(得分:1)

由于(int)总是将数字四舍五入,因此表示形式中的一个小错误使该类型将其四舍五入为一个原本希望的数字。

我尝试了sprintf('%.40F', 9.62 * 100.0);,并得到了这个:"961.9999999999998863131622783839702606201172"

这就是intval( 9.62 * 100 )给您961的原因。

您可以尝试使用bcmul()

(int) bcmul(9.62, 100);

答案 2 :(得分:-1)

请尝试这个

  

ceil(9.62 * 100);