@lexstile

Как сравнить тип данных double/float в условии?

Есть массив:
[3] => Array
                        (
                            [C] => 2.11
                            [CE] => 1
                            [G] => 17
                            [P] => 0.5
                            [T] => 9
                        )

Пишу:
if($arr['P'] == 0.5)
не работает... не попадает в выборку данный массив... как правильно сравнивать подобный тип данных и с чем может быть связана проблема?

UPD:
Как оказалось, проблема не в этом, а в невозможности сравнивать сразу 3 условия, если сравниваю любые другие два, то все работает. Не понимаю, в чем дело...
  • Вопрос задан
  • 6097 просмотров
Решения вопроса 1
@gelirgwenn
Вы некорректно сравниваете числа типа float. Все числа хранятся в двоичном представлении на компьютере, так уж заведено, выбрана такая система счисления, потому что информацию в виде нулей и единиц легче обрабатывать и легче делать чипы и т.п.
Так вот некоторые числа не имеют точного представления в двоичной системе. Например, 0,2 имеет вид примерно такой 0,2000000033..... Соответственно, при сравнении в лоб, вы не сможете гарантировать корректный результат. Вы можете, к примеру, пробовать сравнивать сравнивать разницу с допустимой абсолютной погрешностью:
if (abs($x – $y) < 0.0001) {
     // Do something...
}

Недостаток данного метода описан здесь, а также другие способы сравнения.
Я бы вам рекомендовал перевести float в целое число или строку. В первом случае вы будете сравнивать два целых числа и у вас не будет проблем, во втором - с помощью функции number_format и заданной точности вы преобразуете число в строку, а далее можете сравнивать строки, содержащие числа, с помощью функции bccomp или аналога:
$x = 0.200000000646456546;
$y = 0.200000000676790909;

$results = ($x == $y);
var_dump($results); // bool(false)

$results = bccomp(number_format($x, 5), number_format($y, 5));
var_dump($results); // int(0) - are equal
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы