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???
答案 0 :(得分:2)
这是因为$allowance
是浮点型,而floor
返回的是整数。
为达到预期效果,我建议使用round()
舍入float
值。
http://php.net/manual/ro/function.round.php
的输出:
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.9999999999963620211929082870
是1/3
,但是无论我们在小数点后放置多少0.333333333333333...
,将其乘以3
都不会产生{{ 1}}。