Я унаследовал огромную кучу унаследованного кода, написанного на 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, такой как Doctrine или PROPEL, насколько отличается использование денег в моем коде.
decimal
тип в C # имеет ограниченную точность, но идеально подходит для денежных значений.