遇到四舍五入的问题

时间:2014-03-06 00:32:27

标签: php math floating-point precision

为什么$x1不等于$z2?我已尝试round()并明确将精度更改为8$x1应该等于$z2

$x1 = 251.47267993;
$y1 = 3861.62758730;
$z1 = $x1 / $y1;

echo "{$x1} / {$y1} = {$z1}\n\n"; // ok looks good

$x2 = .06512090;
$y2 = 3861.62758730;
$z2 = $x2 * $y2;

echo "{$x2} x {$y2}  = {$z2}\n\n"; // hmm no - $z2 should be === to $x1

// why do these numbers NOT match? and how can I make them match?
// set some precision somewhere?
echo $x1 . " = " . $z2 . "\n";

更多信息:

_251.47267993_  /3861.62758730  =.06512090
.06512090     *3861.62758730  =_251.47266394_
251.47267993 - 251.47266394  = .00001599

请注意,下划线的2个数字应该相同,我们将其分开 乘以相同的数字。应该倒是......对......但不是我们的时候 不要使用无限数量的数字 - 因为它们不是偶数 关闭,他们相差“0.00001599”

3 个答案:

答案 0 :(得分:1)

不知道你的目的是什么,但你为什么不这样做呢?

$x = 251.47267993;
$y = 3861.62758730;

$z1 = $x / $y;

$z2 = $z1 * $y;

echo $x . " = " . $z2 . "\n";

每次都等于

答案 1 :(得分:1)

还有另一个问题:回显浮动值。您必须增加precision

echo 1 / 3, PHP_EOL;      // 0.33333333333333
ini_set('precision', 60);
echo 1 / 3, PHP_EOL;      // 0.333333333333333314829616256247390992939472198486328125

为什么要尝试使用屏幕上的值而不是变量?

答案 2 :(得分:0)

在PHP中,内置函数并不是那种计算的最佳选择。例如:

echo (int) ((0.1 + 0.7) * 10);

将输出7而不是8。

无论如何,251.47267993 / 3861.62758730不是0.06512090。在进行此计算时,根据计算机体系结构,它将打印不同的结果。对我来说它打印0.065120904138202,这是完全正常的,因为浮点数的精度约为14位小数。

你可以做的是使用BCMath库,这在php.net手册中有很好的记录。对于这种特殊情况,您可以使用:

$z1 = bcdiv($x1, $y1, 200);

而不是:

$z1 = $x1 / $y1;

看到这个数字并不是你想的那么小。有关详细信息,请查看BCMath library