Как мне безопасно выполнять денежные расчеты в PHP? - PullRequest
10 голосов
/ 23 мая 2009

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

Я знаю об ограничениях арифметики с плавающей запятой для этой цели, однако все входные значения представлены в десятичном формате, поэтому, если я использую арифметические операторы над ними, PHP приведёт их к плавающим числам.

Так, как лучше всего справиться с числами? Должен ли я использовать BCMath ? Есть ли что-то похожее на Десятичный в .NET? Или это безопасно использовать арифметические операторы, если я приведу обратно к int?

Ответы [ 3 ]

11 голосов
/ 23 мая 2009

Не работайте в долларах ($ 1,54), работайте в центах: (154 цента). Если вам не нужно выполнять задачи, где важны доли цента, тогда вы будете работать с целыми числами, и все хорошо. Если вас интересуют десятые доли цента, просто умножьте все на десять!

9 голосов
/ 23 мая 2009

Если вы используете BCMath, все значения будут храниться в строках и передаваться в функции в виде строк, так как результатом будет строка. Таким образом, вам не нужно выполнять приведение, но убедитесь, что число, присвоенное функции, является числовым значением значения. Лично, если математика требует высокой точности на десятичной стороне, тогда используйте BCMath.

0 голосов
/ 23 мая 2009

Если вы работаете с разумными суммами («нормальному человеку»), использование плавающей запятой вряд ли будет проблемой, особенно если вы просто складываете и вычитаете суммы, а не, скажем, рассчитываете проценты .

Если вы ищете быстрое решение, переключение на целое число вряд ли вам поможет; вам все равно придется иметь дело с переполнением. (Кто-то отредактировал здесь, чтобы упомянуть, что если PHP встретит число за пределами целочисленного типа, оно будет интерпретировано как число с плавающей точкой вместо . Но тогда вы вернетесь к своей первоначальной проблеме использования плавающей запятой! ) Могут помочь целые числа произвольной длины (GMP, на которые есть ссылки на этой странице).)

По сути, делать это наполовину, работает в большинстве случаев и дешево; делать это правильно - серьезная боль. Мое предложение состоит в том, чтобы рассматривать это как бизнес-проблему: если кто-то жалуется, что упускает ни цента, дайте ему доллар и не беспокойтесь о том, чтобы начать искать реальное решение, пока вы не сэкономите на этом больше долларов.

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