Я работаю с суммами в долларах. В базе данных MySQL следующие поля сбора и ставки (в процентах) имеют тип DECIMAL с точностью до 2 десятичных знаков.
SELECT ROUND(fee * (1- rate/100))),2 ) as profit
from products
Поскольку запрос просто возвращает значения, а не сохраняет их в переменных, существует ли проблема точности * (которая поставляется с PHP или JS)? Если да, то лучше ли округлять число с плавающей запятой в PHP или JS?
* Да, я имею в виду проблему точности, возникающую при сохранении double, например, 1.5 может быть сохранено как 1.49999999
Другие, возможно, упоминали об этом, но я хотел рассказать вам о моей системе обработки денежных расчетов в PHP.
Я использую целые числа. Дело в том, что каждый инкремент соответствует наивысшей точности, которая мне нужна. Для большинства моих заявлений это сотые доли доллара или один цент. Тем не менее, вы можете иметь миллионы или все, что вам нужно.
Таким образом, на практике, с точностью до сотых долей, $ .01 представляется как 1, $ .10 — как 10, $ 1.00 — как 100 и так далее. Это действительно избавляет от проблемы округления, поскольку вы собираетесь манипулировать только целыми числами, поскольку десятичная часть любого вычисления будет усечена. Это нормально, так как целое число представляет наилучшую точность, которая вам нужна.
По общему признанию, это требует немного большего развития, но округление не должно быть одной из возникающих проблем.
Других решений пока нет …