Почему подразделение в Ruby возвращает целое число вместо десятичного значения?
например:
9 / 5 #=> 1
но я ожидал 1.8
. Как я могу получить правильный десятичный (нецелой) результат? Почему он возвращается 1
на всех?
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
.
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