Сравнение чисел с плавающей точкой в php

  • 01.12.2020

Ох уж эти числа с плавающей точкой...

Вот сколько вы думаете будет, если умножить 40155.20 на 100 в языке программирования php? Будет на вид вроде бы 4015520. Но это только на первый взгляд так - на самом деле это будет 4015520 типа float. И это совсем не то же самое, что целочисленные (int) 4015520. И если сравнить в условии (40155.20 * 100) == 4015520, то получаем false.

И до сегодняшнего дня я думал, что это можно обойти вот таким способом: intval(40155.20 * 100) == 4015520 - ну т.е. использовать функцию приведения к int. И оказался не прав - это выражение, несмотря на мое мнение, возвращает, собака, тоже false. Это потому что intval(40155.20 * 100) равно, как ни странно, 4015519 :(

При этом, если поменять цифру intval(30155.20 * 100) == 3015520, то уже будет true. И даже (30155.20 * 100) == 3015520 тоже будет true.

Короче, надо запомнить, что в php лучше делать так: intval(round(40155.20 * 100, 0)) == 4015520
ну так, чтобы наверняка. Т.е. еще и округлять float, прежде чем приводить к int.

И я даже подозреваю, что intval не обязательно делать, так как php, по идее, автоматически приводит типы, но, блин, не доверяю я ему - я уж лучше лишний раз перестрахуюсь.