Точность с плавающей запятой для валюты: использование «округления» функция в запросе MySQL против PHP против Javascript

Я работаю с суммами в долларах. В базе данных MySQL следующие поля сбора и ставки (в процентах) имеют тип DECIMAL с точностью до 2 десятичных знаков.

SELECT ROUND(fee * (1- rate/100))),2 ) as profit
from products

Поскольку запрос просто возвращает значения, а не сохраняет их в переменных, существует ли проблема точности * (которая поставляется с PHP или JS)? Если да, то лучше ли округлять число с плавающей запятой в PHP или JS?

* Да, я имею в виду проблему точности, возникающую при сохранении double, например, 1.5 может быть сохранено как 1.49999999

4

Решение

Другие, возможно, упоминали об этом, но я хотел рассказать вам о моей системе обработки денежных расчетов в PHP.

Я использую целые числа. Дело в том, что каждый инкремент соответствует наивысшей точности, которая мне нужна. Для большинства моих заявлений это сотые доли доллара или один цент. Тем не менее, вы можете иметь миллионы или все, что вам нужно.

Таким образом, на практике, с точностью до сотых долей, $ .01 представляется как 1, $ .10 — как 10, $ 1.00 — как 100 и так далее. Это действительно избавляет от проблемы округления, поскольку вы собираетесь манипулировать только целыми числами, поскольку десятичная часть любого вычисления будет усечена. Это нормально, так как целое число представляет наилучшую точность, которая вам нужна.

По общему признанию, это требует немного большего развития, но округление не должно быть одной из возникающих проблем.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]