Как я безопасно выполняю связанные с деньгами вычисления в PHP?

В C ++, чтобы избежать столкновения имен, вы можете заключить перечисления в структуры:

struct Month { enum {January, February, March, April, May, June, July,
        August, September, October, November, December}; };
struct ShortMonth { enum {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; };
12
задан Demi 23 May 2009 в 02:14
поделиться

3 ответа

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

13
ответ дан 2 December 2019 в 19:32
поделиться

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

10
ответ дан 2 December 2019 в 19:32
поделиться

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

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

В основном, выполнение этого наполовину неопределенным способом работает в большинстве случаев и стоит недорого; делать это правильно - серьезная боль.

-5
ответ дан 2 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: