PHP: 2533.08-2533.08 = 4.54747350886E-13

Недавно розробляючи один проект для банківської сфери, зустрівся з цікавим багом. Почалося це з того, що система в деяких випадках некоректно працювала. Після дебагу знайшов код, де ставалась помилка логіки. Це була проста перевірка. Продовжив дебажити і получився такий код:

<?php
echo $a.'-'.$b.'='.($a-$b);
?>

І на виході в мене получилось: 2533.08-2533.08=4.54747350886E-13. Звичайною логікою пояснити я це не зміг, тому почав гуглити. І гугл показав що я не першовідкривач, до мене люди з таким зустрічались. Просто баг: ) Вирішення цього просте, але воно заставляє заокруглити число до певної кількості символів після коми. Оскільки в мене це сума, то в моєму випадку вистачило двох.

<?php
$a = (round($a * 100)) / 100;
?>

Ось так воно буває, чудеса на рівному місці: )

18 лютого 2011р.
переглядів: 833
Рейтинг: 3.3
Автор: taryk
21.02.11
+1
Страшно стає за банківську сферу... : )
Автор: admin
21.02.11
0
lo l
Автор: taryk
21.02.11
0
Насправді в такому результаті немає нічого дивного, оскільки конкатенація має такий же приорітет як і арифметичні + чи -. Підозрюю що інтерпретатор пробує від $a.'-'.$b.'='.$a відняти $b, тому операції з однаковим або нижчим приорітетом потрібно заключати в дужки.
Автор: admin
21.02.11
0
Ні, дужки там ні при чому, суть в тому, шо воно так сприймає флоат.
Автор: volkodav
22.02.11
0
Якщо це для банку, то цей метод не дуже підходить, адже там при обрахунку великих значень, або малих але за довгий час у великих кількостях будуть пропадати великі суми. Один програміст став мільйонером після того як написав прогу для банків яка відрізала від числа при виконані операцій те, що йде далі 4 символа після коми і відправляє на його рахунок. (Це замітили тік коли вирішили вдосконалити ПО і найняли іншого програміста)
додати коментар
Ваше ім'я
Ваш E-mail