ErwinM
ErwinM

Reputation: 5131

Why is division in Ruby returning an integer instead of decimal value?

For example:

9 / 5  #=> 1

but I expected 1.8. How can I get the correct decimal (non-integer) result? Why is it returning 1 at all?

Upvotes: 312

Views: 220554

Answers (7)

ugandharc18
ugandharc18

Reputation: 649

Fixnum#to_r is not mentioned here, it was introduced since ruby 1.9. It converts Fixnum into rational form. Below are examples of its uses. This also can give exact division as long as all the numbers used are Fixnum.

 a = 1.to_r  #=> (1/1) 
 a = 10.to_r #=> (10/1) 
 a = a / 3   #=> (10/3) 
 a = a * 3   #=> (10/1) 
 a.to_f      #=> 10.0

Example where a float operated on a rational number coverts the result to float.

a = 5.to_r   #=> (5/1) 
a = a * 5.0  #=> 25.0 

Upvotes: 7

Rok Kralj
Rok Kralj

Reputation: 48775

You can include the ruby mathn module.

require 'mathn'

This way, you are going to be able to make the division normally.

1/2              #=> (1/2)
(1/2) ** 3       #=> (1/8)
1/3*3            #=> 1
Math.sin(1/2)    #=> 0.479425538604203

This way, you get exact division (class Rational) until you decide to apply an operation that cannot be expressed as a rational, for example Math.sin.

Upvotes: 26

Renaud
Renaud

Reputation: 16521

You can check it with irb:

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667

Upvotes: 41

Konrad Reiche
Konrad Reiche

Reputation: 29553

There is also the Numeric#fdiv method which you can use instead:

9.fdiv(5)  #=> 1.8

Upvotes: 194

Tyler Eaves
Tyler Eaves

Reputation: 13133

Change the 5 to 5.0. You're getting integer division.

Upvotes: 11

vees
vees

Reputation: 3247

It’s doing integer division. You can make one of the numbers a Float by adding .0:

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8

Upvotes: 296

mu is too short
mu is too short

Reputation: 434985

It’s doing integer division. You can use to_f to force things into floating-point mode:

9.to_f / 5  #=> 1.8
9 / 5.to_f  #=> 1.8

This also works if your values are variables instead of literals. Converting one value to a float is sufficient to coerce the whole expression to floating point arithmetic.

Upvotes: 411

Related Questions