这是我在PHP中看到的最愚蠢的行为。
$num = 4400 / 1.1;
echo doubleval($num); // prints 4000
echo intval($num); // prints 3999
为什么会发生这种情况以及如何解决?
答案 0 :(得分:2)
0.1和0.7之类的数字不适用于二进制表示 阅读'警告'第here部分
如果你需要除以1.1,我建议你这样做:
$num = (4400 * 10) / 11;
或
$num = (4400 * 10.0) / 11;
因为11可以精确地表示为二进制数。
intval()会将不准确的结果截断为最接近 的 doubleval()将四舍五入到最近。
答案 1 :(得分:0)
此问题继承自C
语言。
比较浮动值时会有一点差异,
试试这个,
$tot = 0;
$ans = (float)101;
for($i=1; $i<= 10; $i++){
$tot = $tot + 10.1;
}
if (abs(($tot-$ans)/$tot) < 0.00001) {
echo '<br />Both are equal ';
}
else{
echo '<br />Both are not equal ';
}
输出abs()
Both are equal
没有abs()
输出
Both are not equal
对于上述删除abs()
,即使值相同(小数点也会有小差异),它也会输入else
因此请使用abs()
来解决此问题