Я размышлял о том, как иметь дело с отображением валют и математикой в PHP, и долгое время хранил его в MySQL с использованием типа money_format()
и использовал money_format()
для его форматирования для отображения на веб-странице. Однако сегодня я посмотрел на фактический прототип:
string money_format ( string $format , float $number )
Сейчас я немного смущен. Все, что мне сказали – избегайте плавать за деньги! Но здесь это – основная функция форматирования (скажем, пять раз быстрее), вставляя вход в float. number_format()
делает то же самое.
Поэтому мои вопросы:
Если я не имею дело с дробными центами или триллионами долларов (и я не имею отношения ни с одним из них), должен ли я вообще беспокоиться о отображении и хранении (но никогда не использующем математику) валюты, которая была перенесена в float? Смогу ли я когда-нибудь приблизиться к области, где неточности с плавающей запятой меняют мои цифры?
Если ответ на # 1 заключается в том, что я действительно должен быть обеспокоен, тогда почему money_format()
построен таким образом?
Если я не имею дело с дробными центами или триллионами долларов (и я не имею отношения ни с одним из них), должен ли я вообще беспокоиться о отображении и хранении (но никогда не использующем математику) валюты, которая была перенесена в float? Смогу ли я когда-нибудь приблизиться к области, где неточности с плавающей запятой меняют мои цифры?
Для целей чистого округления / отображения вы будете в безопасности, если абсолютная ошибка представления с плавающей запятой меньше 0,005 (так что округление до ближайшего значения является правильным).
С IEEE 754 с одной точностью вы можете безопасно до $ 131 072,00. (131 072,01 долл. США представлено как 131072,015625, что неправильно округляется).
Двойная точность (которую использует float
PHP) не сработает до 70 368 744 177 664,01 (которая также имеет 0,015625 для центов). Тебе не о чем беспокоиться.
Если ответ на # 1 заключается в том, что я действительно должен быть обеспокоен, тогда почему money_format () построен таким образом?
Какой тип это займет? PHP не имеет встроенного десятичного типа. Также не существует многих других языков.
Это обсуждается в разделе «Почему значения с плавающей запятой настолько плодовиты?»