Odziedziczyłem ogromny stos starszego kodu napisanego w PHP na bazie danych MySQL. Zauważyłem, że aplikacja używa doubles
do przechowywania danych i manipulowania nimi.
Teraz natknąłem się na wiele postów mówiących o tym, że double
nie nadają się do operacji pieniężnych z powodu błędów zaokrąglania. Jednak jeszcze nie znalazłem kompletnego rozwiązania, w jaki sposób wartości pieniężne powinny być obsługiwane w kodzie PHP i przechowywane w bazie danych MySQL.
Czy istnieje najlepsza praktyka, jeśli chodzi o obchodzenie się z pieniędzmi w PHP?
Czego szukam to:
- Jak dane powinny być przechowywane w bazie danych? typ kolumny? rozmiar?
- Jak powinny postępować dane przy normalnym dodawaniu, odejmowaniu. mnożenie czy dzielenie?
- Kiedy powinienem zaokrąglać wartości? Ile zaokrągleń jest dopuszczalne, jeśli w ogóle?
- Czy istnieje różnica między obsługą dużych wartości pieniężnych a niskich?
Uwaga: bardzo uproszczone przykładowy kod jak mogę napotkać wartości pieniądza w życiu codziennym (różne obawy związane z bezpieczeństwem były ignorowane uproszczenie oczywiście w prawdziwym życiu nigdy nie używać mojego kodu takiego.):
$a= $_POST['price_in_dollars']; //-->(ex: 25.06) will be read as a string should it be cast to double?
$b= $_POST['discount_rate'];//-->(ex: 0.35) value will always be less than 1
$valueToBeStored= $a * $b; //--> any hint here is welcomed
$valueFromDatabase= $row['price']; //--> price column in database could be double, decimal,...etc.
$priceToPrint=$valueFromDatabase * 0.25; //again cast needed or not?
Mam nadzieję, że wykorzystasz ten przykładowy kod jako sposób na wydobycie większej liczby przypadków użycia i nie potraktowanie go dosłownie.
Pytanie bonusowe Jeśli mam używać ORM, takich jak Doctrine lub PROPEL, jak różne będą pieniądze w moim kodzie.
decimal
Typ w C # ma ograniczoną precyzję, ale doskonale nadaje się do wartości pieniężnych.