Почему деление в Ruby возвращает целое число вместо десятичного значения? - PullRequest
239 голосов
/ 31 марта 2011

Например:

9 / 5  #=> 1

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

Ответы [ 7 ]

330 голосов
/ 31 марта 2011

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

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

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

249 голосов
/ 31 марта 2011

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

9.0 / 5  #=> 1.8
9 / 5.0  #=> 1.8
164 голосов
/ 24 октября 2013

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

9.fdiv(5)  #=> 1.8
36 голосов
/ 10 февраля 2012

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

$ irb
>> 2 / 3
=> 0
>> 2.to_f / 3
=> 0.666666666666667
>> 2 / 3.to_f
=> 0.666666666666667
26 голосов
/ 23 ноября 2013

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

10 голосов
/ 31 марта 2011

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

5 голосов
/ 25 июня 2017

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