Если иметь дело с деньгами в поплавке плохо, то почему money_format () делает это? - PullRequest
21 голосов
/ 11 января 2011

Я ломал голову над тем, как работать с отображением валюты и математикой в ​​PHP, и долгое время сохранял ее в MySQL, используя тип DECIMAL и используя money_format(), чтобы отформатировать его для отображения на экране. страница интернета. Однако сегодня я посмотрел на фактический прототип:

string money_format ( string $format , float $number )

Я немного растерялся. Все, что мне сказали, это избегать поплавков за деньги! Но вот она, основная функция форматирования (скажем, пять раз быстрее), приводящая ввод к плавающей запятой. number_format() делает то же самое.

Итак, мои вопросы:

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

  2. Если ответ на вопрос № 1 заключается в том, что я действительно должен быть обеспокоен, то почему money_format() построен таким образом?

1 Ответ

22 голосов
/ 12 января 2011

Если я не имею дело с дробным центов или триллионов долларов (и я не имея дело ни с одним), я должен быть обеспокоен вообще о отображении и хранение (но никогда не занимаюсь математикой) валюта, которая была брошена на поплавок? Буду ли я когда-нибудь близко к области с неточностями с плавающей точкой изменить мои цифры?

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

С IEEE 754 с одинарной точностью вы в безопасности до $ 131 072,00. ($ 131 072,01 представлено как 131072.015625, что неправильно округляется.)

Двойная точность (которую использует PHP float) не терпит неудачу до $ 70 368 744 177 664,01 (которая также имеет 0,015625 для центов). Вам не о чем беспокоиться.

Если ответ на вопрос № 1, что я должен действительно беспокоиться, то почему money_format () построен таким образом?

Какой тип должен это займет? В PHP нет встроенного десятичного типа. Как и многие другие языки.

Это обсуждается в & ldquo; Почему значения с плавающей точкой так плодотворны? & Rdquo;

...