[PHP] Сравнение одинаковых чисел не работает?
Вопрос к знатокам. Скорее всего я, что-то упускаю из виду…
Под катом вопросы…
Вопросы:
$var1 = floatval(995); // double 995
$var2 = floatval(19.9 * 50); // double 995
$var3 = floatval(1990 - floatval(19.9 * 50)); // double 995
$format = '%0' . "b\n";
printf($format, $var1); // 1111100011
printf($format, $var2); // 1111100010
printf($format, $var3); // 1111100011
print PHP_EOL . '===' . PHP_EOL;
print intval($var1 === $var2) . PHP_EOL; // false
print intval($var1 === $var3) . PHP_EOL; // false
print intval($var2 === $var3) . PHP_EOL; // false
print PHP_EOL . 'intval === intval' . PHP_EOL;
print intval(intval($var1) === intval($var2)) . PHP_EOL; // false
print intval(intval($var1) === intval($var3)) . PHP_EOL; // true
print intval(intval($var2) === intval($var3)) . PHP_EOL; // false
print PHP_EOL . 'round === round' . PHP_EOL;
print intval(round($var1, 2) === round($var2, 2)) . PHP_EOL; // true
print intval(round($var1, 2) === round($var3, 2)) . PHP_EOL; // true
print intval(round($var2, 2) === round($var3, 2)) . PHP_EOL; // trueПод катом вопросы…
Вопросы:
- Почему $var1 и $var3 в битах 1111100011, а $var2 — 1111100010?
- Почему $var1 и $var3 не равны (ни тождественно, ни обычно)?
- Почему только после обработки round-ом все 3 числа становятся равны?
Комментарии: 17
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Неужели настолько незаметно?
?
php.net/manual/ru/language.types.integer.php#language.types.integer.casting
floatval(19.9 * 50) по факту чуть меньше чем 995, а floatval(1990 — floatval(19.9 * 50)) чуть больше (в десятичном представлении), при intval число округляется в строну 0, поэтому var2 становится 994,var3 = 995, отсюда и результаты
вроде бы
На деле так оно и есть.
Как решение, и так мы и делали, когда писали биллинг, это всегда приводить правильно к типу, т.е. работать всегда явно с float.