Внезапный рациональный результат от разработки в 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