Mysql
 sql >> база данни >  >> RDS >> Mysql

Грешка десетичната точност на MySQL и PHP

От статия, която написах за 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Buddy – уеб базиран инструмент за администриране на MySQL

  2. alter table add ... преди `code`?

  3. Как да започна автоматично увеличение от конкретна точка?

  4. Ansible идемпотентна MySQL инсталация Playbook

  5. Изберете ограничение за уникални записи с N реда