Почему подразделение в Ruby возвращает целое число вместо десятичного значения?


например:

9 / 5  #=> 1

но я ожидал 1.8. Как я могу получить правильный десятичный (нецелой) результат? Почему он возвращается 1 на всех?

7 210

7 ответов:

Это целочисленное деление. Вы можете сделать одно из чисел a Float добавлять .0:

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

Это целочисленное деление. Вы можете использовать to_f чтобы заставить вещи в режим с плавающей запятой:

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

Это также работает, если ваши значения переменных вместо литералов. Преобразование одного значения в значение с плавающей запятой достаточно, чтобы принудить все выражение к арифметике с плавающей запятой.

есть еще Numeric#fdiv метод, который можно использовать:

9.fdiv(5)  #=> 1.8

вы можете проверить это с помощью irb:

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

вы можете включить рубиновый mathn модуль.

require 'mathn'

таким образом, Вы сможете сделать разделение нормально.

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

таким образом, вы получаете точное деление (класс Rational), пока не решите применить операцию, которая не может быть выражена как рациональная, например Math.sin.

изменить 5 до 5.0. Вы получаете целочисленное деление.

Fixnum#to_r здесь не упоминается, он был введен с ruby 1.9. Он преобразует Fixnum в рациональную форму. Ниже приведены примеры его использования. Это также может дать точное деление до тех пор, пока все используемые числа являются 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

пример, где поплавок работает на рациональное число кроет результат, чтобы плавать.

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