的结果如何?
intval("19.90"*100)
是
1989
正如人们所期望的那样而不是1990
(PHP 5.2.14)?
答案 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不会传递“整数值”,而是整数(即非小数)部分的数字。它不圆。