Php странное округление

#php

#php

Вопрос:

Простой вопрос: Почему такое поведение:

 var_dump($calc_product);
var_dump($calc_price);
var_dump(round($calc_product,1));
var_dump(round($calc_price,1));
  

дает:

 float(16.05) float(16.05) float(16) float(16.1)
  

Спасибо!

Комментарии:

1. Похоже, что первое округляет в меньшую сторону, в то время как второе округляет в большую. Можете ли вы показать некоторый контекст для того, где на самом деле установлены значения с плавающей точкой? Единственное, о чем я могу думать, это о том, что $ calc_product на самом деле равен 16.049999999 или чему-то подобному, который var_dump округляет до 2 десятичных мест.

2. Не удается воспроизвести. Всегда возвращает 16.1 .

3. здесь работает идеально : float(16.05) float(16.05) float(16.1) float(16.1)

4. не знал, что var_dump округляется до 2 десятичных мест.. Проверю это. Спасибо!

5. вы пробовали php.net/manual/en/function.number-format.php

Ответ №1:

Не используйте значения с плавающей точкой ради денег.

Распространенный метод заключается в том, чтобы сохранить цену в пенсах / центах, а затем разделить на 100 при отображении. Это означает, что вместо этого вы можете использовать целочисленную арифметику и позволяет избежать этой проблемы.

Комментарии:

1. Все в порядке! Стоит разобраться в поплавках, но для вещей, которые должны быть абсолютно точными (например, деньги!), они не являются хорошим выбором.

Ответ №2:

Читать

number_format и

money_format

уверен, это вам поможет. 🙂