Как бороться со странным округлением плавающих в PHP

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

В качестве примера, в 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 

Как бы вы обошли это?

Добро пожаловать в IEEE754, наслаждайтесь пребыванием .

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

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

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