Нечетная проблема округления при использовании спецификатора ruby printf-format
-
10-07-2019 - |
Вопрос
У кого-нибудь есть идеи по этому поводу? Р>
Когда мы бежим:
printf ("%. 0f " ;, 40.5)
Для окна Windows возвращаемое значение равно «41». но на нашем производственном сервере Ubuntu мы получаем «40»
Решение
Похоже на простой случай неточности двоичной плавающей запятой . На одной машине вы получаете 40.499999999, который округляется до 40; на другой машине вы получите 40.500000000001, который округляется до 41.
Если вам нужны точные числа, вы не должны использовать двоичные числа с плавающей запятой. Вы можете использовать десятичную с фиксированной запятой или десятичную с плавающей запятой.
Редактировать: вы говорите, что используете BigDecimal. Почему бы не избежать преобразования в float, используя #round
, а затем #to_i
? (Или #floor
или #ceil
вместо #round
... неясно, какова ваша цель.)
b = BigDecimal.new("40.5")
print b.round.to_i # => 41
Другие советы
Как насчет использования .round
? Rails даже улучшает его, так что вы можете указать точность ( см. API док ). р>
используйте% .0g вместо этого
Ответ СкоттаJ не объясняет вашу проблему - 40.5 точно представлен в двоичном виде. Вероятно, происходит следующее: printf в Windows округляется наполовину, quot; и Ubuntu printf «округляет половину четного».