PHP中奇怪的数字转换错误

时间:2011-02-08 14:55:07

标签: php floating-point

的结果如何?
intval("19.90"*100)

1989
正如人们所期望的那样

而不是1990(PHP 5.2.14)?

5 个答案:

答案 0 :(得分:12)

那是因为19.90在基数2中并不完全可以表示,而最接近的近似值略低于19.90。

即,这个最接近的近似值恰好是2 ^ -48×0x13E66666666666。如果您有兴趣,可以用十进制格式here查看其确切值。

当你乘以100时会传播这个舍入误差。intval将强制浮动的强制转换为整数,并且此类强制转换总是向0舍入,这就是为什么你看到1989。请改用round

答案 1 :(得分:3)

您还可以使用bc *函数来处理float:

$var = bcmul("19.90", "100");
echo intval($var);

答案 2 :(得分:2)

intval 通过截断数字的小数部分将双精度转换为整数。处理某些值时,这可能会产生奇怪的结果。请考虑以下事项:

print intval ((0.1 + 0.7) * 10);

这很可能打印7 ,而不是期望值8

有关详细信息,请参阅PHP manual

中有关浮点数的部分

答案 3 :(得分:1)

为什么在浮点数上使用intval?我同意你的意见,输出有点偏,但它与浮点数的相对精度有关。

为什么不使用输出floatval("19.90"*100)

1990

答案 4 :(得分:1)

我相信http://de2.php.net/manual/en/function.intval.php的php文档省略了这样一个事实,即intval不会传递“整数值”,而是整数(即非小数)部分的数字。它不圆。