Внезапный рациональный результат от разработки в Ruby on Rails

При выполнении деления в IRB:

6/3600

результат всегда 0.

Но в живом Rails-приложении, запущенном в WEBrick или Apache/Passenger, такое же разделение приводит к 1/600 значение типа Rational,

Я получаю тот же результат Rational при выполнении деления в часах останова в RubyMine 6.3.3.

Оба аргумента всегда целочисленные.

1 ответ

Решение

Это связано с mathn модуль. По какой-то причине он не загружается в IRB, но загружается чем-то в сеансе вашего сервера и, вероятно, из гема отладки в сеансе отладки RubyMine.

Поведение, которое вы испытали, описано здесь: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/mathn/rdoc/Numeric.html

Вы можете проверить это в своей сессии IRB. 6/3600 результаты в 0, После того, как вы загрузили mathn с require 'mathn' Вы получаете другой результат. Это будет (1/600) вместо.

Вы также можете форсировать каждую ситуацию, чтобы сделать ваш код более устойчивым на этом этапе. Если вы хотите получить рациональный результат, вы можете сделать что-то вроде 6/3600.to_r или наоборот, если mathn загружен (6/3600).to_i, Другой способ сделать явное деление - использовать метод div(),

Здесь дамп сеанса IRB, который является заключением текста выше.

>> 6/3600
0

>> 6/3600.to_r
(1/600)

>> require 'mathn'
true

>> 6/3600
(1/600)

>> (6/3600).to_i
0

>> 6.div(3600)
0

Эта тема также обсуждается здесь: https://bugs.ruby-lang.org/issues/2121

Другие вопросы по тегам