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

Например:

9 / 5  #=> 1

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

9.fdiv(5)  #=> 1.8

Ответ 4

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

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

Ответ 5

Вы можете включить модуль ruby ​​ 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.

Ответ 6

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

Ответ 7

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