Перейти к содержанию

Ruby/Справочник/Rational

Материал из Викиучебника — открытых книг для открытого мира

Класс Rational < Numeric

[править]

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

Создание рационального числа:

Rational(a, b)             #-> a/b
Rational.new!(a, b)        #-> a/b

Например:

Rational(5,6)             #-> 5/6
Rational(5)               #-> 5/1

Рациональные числа автоматически нормируются (читай, «делит числитель и знаменатель на их НОД»):

Rational(6, 10)            #-> 3/5

Но не во время создания методом new!:

Rational.new!(6, 10)       #-> 6/10

Деление на ноль — недопустимо (то есть знаменатель не должен равняться нулю):

Rational(3, 0)             #-> ZeroDivisionError

Методы класса

new!, reduce

Методы объекта

%, **, *, +, -, /, <=>, ==, abs, coerce, divmod, hash, inspect, to_f, to_i, to_r, to_s

Атрибуты

denominator, numerator

Rational::new!

[править]

Rational.new!(num,den)   #-> rational

Реализует конструктор. Этот метод не нормализует (читай, «не делит числитель и знаменатель на их НОД») полученную рациональную дробь и не проверяет знаменатель на равенство нулю.

Rational.new!(6, 10)   #-> Rational(6, 10)
Rational.new!(6, 0)    #-> Rational(6, 0)
Информация

Для того, чтобы во время создания рационального числа производить нормализацию и проверку на равенство знаменателю нулю, необходимо использовать метод Rational()

Rational::reduce

[править]

Rational.reduce(num,den)   #-> rational

Создает и нормализует рациональное число путем деления числителя и знаменателя на их НОД.

Rational#%

[править]

r % other   #-> numeric

Возвращает остаток от деления числа r на число other.

r = Rational(7,4)    #-> Rational(7,4)
r % Rational(1,2)    #-> Rational(1,4)
r % 1                #-> Rational(3,4)
r % Rational(1,7)    #-> Rational(1,28)
r % 0.26             #-> 0.19

Rational#*

[править]

r * other   #-> numeric

Возвращает произведение числа r и числа other.

r = Rational(3, 4)   #-> Rational(3, 4)
r * 2                #-> Rational(3, 2)
r * 4                #-> Rational(3, 1)
r * 0.5              #-> 0.375
r * Rational(1, 2)   #-> Rational(3, 8)

Rational#**

[править]

r ** other   #-> numeric

Возвращает результат возведения числа r в степень other.

r = Rational(6, 8)   #-> Rational(3, 4)
r ** 2               #-> Rational(9, 16)
r ** 2.0             #-> 0.5625
r ** Rational(1,2)   #-> 0.866025403784439

Rational#+

[править]

r + other   #-> numeric

Возвращает сумму чисел r и other.

r = Rational(6, 8)     #-> Rational(3, 4)
r + 1                  #-> Rational(7, 4)
r + 0.5                #-> 1.25

Rational#-

[править]

r - other   #-> numeric

Возвращает реузльтат вычитания из числа r числа other.

r = Rational(6, 8)   #-> Rational(3, 4)
r - 1                #-> Rational(-1, 4)
r - 0.5              #-> 0.25

Rational#/

[править]

r / other   #-> numeric

Возвращает результат деления числа r на число other.

r = Rational(3, 4)    #-> Rational(3, 4)
r / 2                 #-> Rational(3, 8)
r / 2.0               #-> 0.375
r / Rational(1, 2)    #-> Rational(3, 2)

Rational#<=>

[править]

r <=> other   #-> -1, 0, +1

Стандартная операция сравнения двух чисел (r и other). Возвращает −1, 0 или +1, если r больше, равно или меньше other, соответственно. Данный метод необходим, чтобы заработала примесь Comparable класса Numeric (а заодно и для класса Rational, так как он является наследником Numeric).

Rational#

[править]

r == other   #-> true или false

Возвращает true, если значение r численно равно other. Число r равно числу other, если их числители и знаменатели равны между собой.

Rational(1, 2) == Rational(4, 8)          #-> true
Rational(1, 2) == Rational.new!(4, 8)     #-> false

Rational#abs

[править]

r.abs   #-> rational

Возвращает абсолютное значение числа r.

Rational(-3, 2).abs   #-> Rational(3, 2)
Rational(3, -2).abs   #-> Rational(3, 2)

Rational#coerce

[править]

r.coerce(other)   #-> array

Возвращает массив, состоящий из чисел other и r преобразованных к одному типу. Необходим для арифметических операций между числами разных типов.

r = Rational(6, 4)   #-> Rational(3, 2)
r.coerce(3)          #-> [Rational(3, 1), Rational(3, 2)]
r.coerce(3.2)        #-> [3.2, 1.5]

Rational#divmod

[править]

r.divmod(other)   #-> array

Возвращает массив, состоящий из частного и остатка от деления числа r на число other.

r = Rational(7, 4)        #-> Rational(7, 4)
r.divmod Rational(1, 2)   #-> [3, Rational(1, 4)]
r.divmod 3                #-> [0, Rational(7, 4)]

Rational#hash

[править]

r.hash   #-> fixnum

Возвращает контрольную сумму числа r.

Rational(7, 400).hash   #-> 814
Rational(7, 4).hash     #-> 6

Rational#inspect

[править]

r.inspect   #-> string

Возвращает восстановленное строковое представление числа r.

Rational(5, 8).inspect     #-> "Rational(5, 8)"

Rational#to_f

[править]

r.to_f   #-> float

Преобразует число r в дробное.

Rational#to_i

[править]

r.to_i   #-> integer

Преобразует число r в целое. Преобразование осуществляется не усечением дробной части, а округлением до ближайшего целого.

Rational(+7, 4).to_i            #-> 1
Rational(-7, 4).to_i            #-> -2

Иначе говоря:

Rational(-7, 4) == -1.75                 #-> true
Rational(-7, 4).to_i == (-1.75).to_i     #-> false

Rational#to_r

[править]

r.to_r   #-> r

Возвращает значение r.

Rational#to_s

[править]

r.to_s   #-> string

Возвращает строковое представление рационального числа.

Rational(3,4).to_s          #->  "3/4"
Rational(8).to_s            #->  "8"