Похож на простой случай binary floating point imprecision. На одной машине вы получаете 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
Я сохранил пример очень просто, но это число действительно происходит из поля BigDecimal в базе данных. Я уверен, что проблема с плавающей запятой, о которой вы говорите, не совсем понятна, почему ее считают плавающей точкой. У вас по-прежнему возникает проблема: «% .0f»% BigDecimal («40.5») и «% .0d»% BigDecimal («40.5») – tsdbrown
Это потому, что BigDecimals здесь преобразуются в float (через #to_f) перед тем, как перейти к операции форматирования. – ScottJ
В случае, если это было не ясно, я отредактировал мой выше ответ, чтобы решить проблему с BigDecimal. – ScottJ