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

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

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

printf("%.0f", 40.5)

В окне Windows возвращается «41», но на нашем производственном сервере Ubuntu мы получаем «40»

Ответы [ 4 ]

2 голосов
/ 30 ноября 2009

Как насчет использования .round вместо этого? Rails даже улучшает его, так что вы можете указать точность ( см. API doc ).

1 голос
/ 18 июля 2010

Ответ СкоттаJ не объясняет вашу проблему - 40.5 точно представлен в двоичном виде. Вероятно, происходит следующее: printf Windows округляет половину, а printf Ubuntu округляет половину.

1 голос
/ 14 февраля 2010

используйте% .0g вместо

0 голосов
/ 01 декабря 2009

Выглядит как простой случай двоичной погрешности с плавающей запятой . На одной машине вы получаете 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
...