简单乘法的PHP舍入误差

2022-04-01 00:00:00 rounding int casting 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

相关文章