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