От статия, която написах за Authorize.Net :
Едно плюс едно е равно на две, нали? Какво ще кажете за .2 плюс 1,4 по 10? Това е равно на 16, нали? Не, ако правите математиката с PHP (или повечето други езици за програмиране):
echo floor((0.2 + 1.4) * 10); // Should be 16. But it's 15!
Това се дължи на начина, по който числата с плаваща запетая се обработват вътрешно. Те са представени с фиксиран брой десетични знаци и могат да доведат до числа, които не се събират точно както очаквате. Вътрешно нашия пример .2 плюс 1,4 по 10 се изчислява на приблизително 15,9999999998 или така. Този вид математика е добра, когато работите с числа, които не трябва да са точни като проценти. Но когато работите с пари, прецизността има значение, тъй като липсващата стотинка или долар тук или там се събират бързо и никой не обича да е на крачка от липсващите пари.
Математическото решение BC
За щастие PHP предлага разширението BC Math което е "за математика с произволна точност PHP предлага двоичен калкулатор, който поддържа числа с всякакъв размер и точност, представени като низове." С други думи, можете да правите точна математика с парични стойности, като използвате това разширение. Разширението BC Math съдържа функция които ви позволяват да извършвате най-често срещаните операции с прецизност, включително добавяне , изваждане , умножение , и разделение .
По-добър пример
Ето същия пример като по-горе, но използвайки функцията bcadd(), за да направим математиката вместо нас. Необходими са три параметъра. Първите две са стойностите, които искаме да добавим, а третата е броят на десетичните знаци, за които искаме да бъдем точни. Тъй като работим с пари, ще зададем точността на два знака след десетичната запетая.
echo floor(bcadd('0.2', '1.4', 2) * 10); // It's 16 like we would expect it to be.