当公式相同时,PHP地板会返回两个不同的结果?

时间:2019-03-06 05:38:42

标签: php division multiplication floor

echo 'For the month of January-2019';
echo'<hr>';
echo $basicValue = floor((250000 / 31) * 31);

echo '<br>';

echo $allowance = (30000 / 31) * 31;
echo '<br>';
echo $house_rent=floor($allowance);
echo'<hr>';
echo 'For the month of February-2019';
echo'<hr>';
echo $basicValue = floor((250000 / 28) * 28);

echo '<br>';

echo $allowance = (30000 / 28) * 28;
echo '<br>';
echo $house_rent=floor($allowance); // This is return 29999 that is wrong???

2 个答案:

答案 0 :(得分:2)

这是因为$allowance是浮点型,而floor返回的是整数。

为达到预期效果,我建议使用round()舍入float值。

http://php.net/manual/ro/function.round.php

请参阅:https://3v4l.org/skrQC

的输出:

echo 'For the month of January-2019';
echo "\n";
echo $basicValue = floor((250000 / 31) * 31);

echo "\n";

echo $allowance = (30000 / 31) * 31;
echo "\n";
var_dump($allowance);
$allowance = intval($allowance);
echo "\n";
var_dump($allowance);
echo "\n";
echo $house_rent=floor($allowance);
echo "\n";
echo 'For the month of February-2019';
echo "\n";
echo $basicValue = floor((250000 / 28) * 28);

echo "\n";

echo $allowance = (30000 / 28) * 28;
echo "\n";
var_dump($allowance);
$allowance = intval($allowance);
echo "\n";
var_dump($allowance);
echo $house_rent=floor($allowance); // This is return 29999 that is wrong???

是:

For the month of January-2019
250000
30000
float(30000)

int(30000)

30000
For the month of February-2019
250000
30000
float(30000)

int(29999)
29999

答案 1 :(得分:0)

30000 / 28的值不是整数,因此无法准确表示。出现较小的舍入误差。计算机中表示的值略小于表达式的确切数学值。当乘以28时,结果比30000略小,并且floor()会执行应做的工作:忽略小数部分,仅返回{{1}的整数部分}。

在计算机中表示的29999的值大约为30000 / 28 * 28

详细了解浮点表示以及使用浮点表示可能遇到的问题:https://floating-point-gui.de/


这不是PHP或计算机中数字浮点数表示的问题。这在现实生活中也会发生。

我们通常认为29999.99999999999636202119290828701/3,但是无论我们在小数点后放置多少0.333333333333333...,将其乘以3都不会产生{{ 1}}。