Čuvanje decimalnih brojeva u MySQL bazi
Ovaj savet nije direktno vezan za PHP, ali je bitan ako baratate sa decimalnim brojevima – što je standardan slučaj kod čuvanja podataka o novčanim tokovima.
U tom slučaju su vam decimale jako bitne, prvenstveno zbog greške u zaokruživanju koja dolazi zbog načina čuvanja decimalnih brojeva. MySQL server generalno podržava dva formata čuvanja decimalnih brojeva:
DOUBLE (FLOAT) i DECIMAL.
Ukoliko ne želite da isprobate način bogaćenja koji je opisan u filmu Superman III, gde snalažljivi programer malom modifikacijom koda na svoj račun prebacuje delove dolara sa treće decimale koji su zbog zaokruživanja nestajali, i tako zbog velikog broja transakcija vrlo brzo prikupi stotine hiljada dolara, za tip kolone u kojoj čuvate podatke o iznosu novca izaberite DECIMAL.
DECIMAL čuva podatke o decimalama sa tačnom preciznošću, dok DOUBLE (i FLOAT) tipovi čuvaju podatke u Mantisa/Eksponent formatu koji je prezican do određene decimale (na primer FLOAT je precizan do otprilike sedme decimale).
Ukratko, to znači da će matematičke operacije nad DOUBLE i FLOAT vrednostima davati pogrešne rezultate. Greška će biti vrlo mala, ali kod operacija sa novcem nema dovoljno male greške.
Na primer sabiranje DOUBLE vrednosti 0.1 + 0.2 će dati rezultat koji će izgledati otprilike ovako: 0.30000000000000002; noćna mora za finansijski sektor. Sabiranje istih ovih vrednosti sačuvanih u DECIMAL formatu će dati tačno 0.3
Primer grešaka do kojih može doći zbog zaokruživanja možete videti i na Google-u:
Google ne može da pogreši – matematika nije u pravu
Detaljnije o ovoj problematici možete pročitati na:
http://www.heldit.com/2009/11/database/mysql-float-vs-decimal-money-datatype/
DOUBLE i FLOAT koristite za velike decimalne brojeve gde vam tačna prezicnost nije ključna, a DECIMAL za čuvanje novčanih iznosa (gde ne želite nikakve greške zaokruživanja)