Я успадкував величезну купу застарілого коду, написаного на PHP, на вершині бази даних MySQL. Я помітив, що додаток використовує doubles
для зберігання та обробки даних.
Зараз я натрапив на численні дописи, де згадували, як double
не підходять для грошових операцій через помилки округлення. Однак я ще не зіткнувся з повним рішенням, як обробляти грошові величини в PHP-коді та зберігати в базі даних MySQL.
Чи є найкраща практика, коли мова йде про обробку грошей спеціально на PHP?
Що я шукаю:
- Як слід зберігати дані в базі даних? тип стовпця? розмір?
- Як слід обробляти дані в звичайному складенні, відніманні. множення чи ділення?
- Коли слід округлювати значення? Наскільки допустиме округлення, якщо воно є?
- Чи є різниця між обробкою великих грошових цінностей і низьких?
Примітка: дуже спрощений приклад коду , як я міг би зіткнутися цінності грошей в повсякденному житті (різні питання безпеки були проігноровані для спрощення Звичайно , в реальному житті я ніколи б не використовувати мій код , як це.):
$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?
Я сподіваюся, що ви використовуєте цей зразок коду як засіб, щоб виявити більше випадків використання, а не, звичайно, приймати його.
Питання про бонус Якщо я буду використовувати ORM, наприклад, доктрину чи PROPEL, наскільки різним буде використання грошей у моєму коді.
decimal
тип C # має обмежену точність, але цілком підходить для грошових значень.