简单乘法的PHP舍入误差
使用(int)
强制转换变量时,PHP似乎不正确地进行舍入。为什么?
$multiplier = 100000000;
$value = 0.01020637;
echo (int)($value*$multiplier);
输出:1020636
。(意外输出)
$multiplier = 100000000;
$value = 0.01020637;
echo ($value*$multiplier);
输出:1020637
。(预期输出正确)
编辑:情况变得更糟...
$multiplier = 100000000;
$value = 0.01020637;
echo $temp = ($value*$multiplier);
echo '<br/>';
echo (int)$temp;
输出:
1020637
1020636
解决方案
当您处理浮点时,事情可能会变得很复杂,浮点数学(以及涉及的问题)很容易理解,但在您意想不到的时候可能会突然出现。就像在这里发生的那样。您可以广泛阅读the rules,或者在处理浮点运算时使用语言提供的工具。
当您关心所涉及的精度时,应该使用bcmul()函数。这是一个"可选的"扩展,但如果您关心精度,很快就会开始需要它。
示例:
multiplier = 100000000;
$value = 0.01020637;
echo (int)($value*$multiplier);
echo "
";
echo bcmul($value, $multiplier, 0);
示例:http://ideone.com/Wt9kKb
相关文章