У меня есть следующий код PHP, в котором я хочу сравнить два десятичных числа. Я прочитал в документации PHP, что числа с плавающей точкой имеют ограниченную точность.
$a = 0.0;
for ($i = 0; $i < 10; $i++) {
$a += 0.1;
}
var_dump($a);
echo gettype($a);
if ($a === 1.0) {
echo "IF";
} else {
echo "ELSE";
}
Когда я сравниваю переменную $ a с 1.0, она всегда возвращает false, и результатом будет ‘ELSE’. Мой вопрос заключается в том, как я могу заставить код выше работать должным образом.
Вы можете просто сделать это так:
// просто проверить, если это число с плавающей запятой, затем округлить его до 1 десятичного числа и сравнить
if(is_float($a)){
echo 'not a float';
$a = round($a,1);
}
и вывод будет «ЕСЛИ»
Этот вопрос задавался ранее, смотрите Сравнить поплавки в PHP.
По сути, вам нужно рассчитать разницу и посмотреть, достаточно ли она мала, чтобы быть приемлемой как «равная».
Попробуйте что-то вроде этого:
$a = 0.0;
for ($i = 0; $i < 10; $i++) {
$a += 0.1;
$a=number_format($a,1);
//echo gettype($a);
//echo $a.'<br>';
if (floatval($a) === 1.0)
echo "IF";
else
echo "ELSE";
}
Чтобы сделать сравнение, я бы усек $ a до одного десятичного знака, отформатировал $ a в строку с требуемой точностью и сравнил бы ее с «1.0».
Чтобы усечь $ я предлагаю читая этот ответ .
Или вы можете использовать $ a как целое число. Их вместо увеличения на 0,1 используют 1. И используют 10 в конечном сравнении.