Как бороться со странным округлением поплавков в PHP - PullRequest
8 голосов
/ 12 февраля 2010

Как мы все знаем, арифметика с плавающей запятой не всегда полностью точна, но как вы справляетесь с ее несоответствиями?

Например, в PHP 5.2.9: (этого не происходит в 5.3)

echo round(14.99225, 4);  // 14.9923 
echo round(15.99225, 4);  // 15.9923 
echo round(16.99225, 4);  // 16.9922 ??
echo round(17.99225, 4);  // 17.9922 ??
echo round(25.99225, 4);  // 25.9922 ??
echo round(26.99225, 4);  // 26.9923

Как бы вы обойти это?

Ответы [ 2 ]

8 голосов
/ 12 февраля 2010

Добро пожаловать в IEEE754, приятного пребывания .

Вместо этого используйте bc или gmp.

4 голосов
/ 12 февраля 2010

как вы справляетесь с его несогласованности?

  • Для вещей, где точные результаты, основанные на десятичном представлении, имеют значение (то есть деньги), не используют IEEE754 с плавающей точкой, вы используете библиотеки "bignum", такие как BCMath
  • Для вещей, где ваши расчеты должны быть относительно точными (как и большинство научных расчетов), вы используете численно устойчивые алгоритмы, чтобы несоответствия оставались в младших значащих битах ( где они не имеют значения).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...