Нечетная проблема округления при использовании спецификатора ruby ​​printf-format

StackOverflow https://stackoverflow.com/questions/1819250

Вопрос

У кого-нибудь есть идеи по этому поводу?

Когда мы бежим:

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 «округляет половину четного».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top