2015-03-09 3 views
0

Я написал много приложений PHP и только что наткнулся на странный сценарий. Функция round не работает в очень сложном наборе кода. Я пробовал много разных вещей, прежде чем звонить, но это просто не работает. Функция возвращает 0.56000000000000001 при заданном round($val,2), с $val=0.5600. Это должно, очевидно, вернуть 0.56.round() возвращает избыточное количество десятичных знаков

Я изменил свой код, чтобы использовать number_format($val,2,',',''). Кажется, это решило проблему, но теперь я догадываюсь о моем другом коде.

Должен ли я заменить круглый на number_format всюду? Кто-нибудь имел подобные ошибки с раундом?

Также следует отметить, что это связано с PhpExcel, который используется в этом случае. https://github.com/PHPOffice/PHPExcel/issues/237

ответ

2

Нет необходимости в замене round на number_format. Вы можете использовать round с флагом для округления.

Выберите, что лучше всего подходит для приложения.

  • Вы округлите float? Использовать round
  • Вы хотите отформатировать число и группу по тысячам? Используйте number_format

<?php 
$number = '0.5600'; 
echo round((float)$number, 2, PHP_ROUND_HALF_DOWN); 

https://eval.in/297781

0

Вопрос заключается в том, что не каждый десятичное число может быть представлено точно в стандартной плавающей точкой. Это очень распространенная проблема, ваша не уникальна. Если вам нужно точное представление, то то, что вы делаете, то есть преобразование с плавающей точкой в ​​строку, будет достаточно.

Некоторые другие решения:

  • преобразующие == с плавающей точкой в ​​<= или >=
  • преобразовать == с допуском, например, b–ε ≤ a ≤ b+ε, с ε какая-либо постоянная или стоимость относительно |a| или |b| или оба
Смежные вопросы