Подтвердить что ты не робот

Если иметь дело с деньгами в поплавке, это плохо, то почему money_format() делает это?

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

string money_format ( string $format , float $number )

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

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

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

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

4b9b3361

Ответ 1

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

Для целей чистого округления/отображения вы будете в безопасности, если абсолютная ошибка представления с плавающей запятой меньше, чем $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 не имеет встроенного десятичного типа. Также не много других языков.

Это обсуждается в "Почему значения с плавающей запятой настолько плодовиты?"