PHP floor возвращает два разных результата, когда формула одинакова? - PullRequest
1 голос
/ 06 марта 2019
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 ]

2 голосов
/ 06 марта 2019

Это потому, что $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
0 голосов
/ 06 марта 2019

Значение 30000 / 28 не является целым числом и не может быть точно представлено.Возникает небольшая ошибка округления.Значение, представленное в компьютере, немного меньше точного математического значения выражения.При умножении на 28 результат немного меньше, чем 30000, и floor() делает то, что должен: игнорирует десятичную часть и возвращает только целую часть, равную 29999.

Значение 30000 / 28 * 28 в том виде, как оно представлено в компьютерах, составляет приблизительно 29999.9999999999963620211929082870.

Подробнее о представлении с плавающей запятой и проблемах, с которыми вы можете столкнуться при его использовании: https://floating -point-gui.de /


Это не проблема PHP или представления чисел в числах с плавающей точкой.Это то, что также происходит в реальной жизни.

Обычно мы считаем, что 1/3 - это 0.333333333333333..., но независимо от того, сколько 3 мы ставим после десятичной точки, умножение на 3 не делает 'т производства ровно 1

...