1

When doing the devision in IRB:

6/3600

the result is always 0.

But in a live Rails application running in WEBrick or Apache/Passenger the same division results in 1/600 value of type Rational.

I am getting the same Rational result when doing division in a breakpoint's watch in RubyMine 6.3.3

Both arguments are always Integer.

Paul
  • 25,812
  • 38
  • 124
  • 247

1 Answers1

1

This has to do with the mathn module. For some reason it's not loaded in your IRB, but it's loaded by something in your server session and probably from a debugging gem in the RubyMine debug session as well.

The behaviour you experienced is documented here: http://www.ruby-doc.org/stdlib-2.1.1/libdoc/mathn/rdoc/Numeric.html

You can test this in your IRB session. 6/3600 results in 0. After you loaded mathn with require 'mathn' you get another result. It will be (1/600) instead.

You can also force each situation, to make your code more robust at this point. If you want a rational result anyway you can do something like 6/3600.to_r or vice versa if mathn is loaded (6/3600).to_i. Another way to make a division explicit is to use the method div().

Here a dump of an IRB session, which is a conclusion of the text above.

>> 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

This topic is also discussed here: https://bugs.ruby-lang.org/issues/2121

Robin
  • 8,162
  • 7
  • 56
  • 101
  • Thank you for the clue. Mathn really replaces the / division operator for `Fixnum` and `Bignum` classes making it an alias for `quo` method. I found usage of Mathn in `geometry` and `ruby-units` gems. If they are removed from `Gemfile` division works in a normal way. – Paul Oct 02 '14 at 11:48