Почему остаток от числа с плавающей точкой, деленный на большее целое число, чем он сам, возвращает число с плавающей точкой? - PullRequest
0 голосов
/ 19 января 2020

Я довольно плохо знаком с концепцией программирования, сейчас я изучаю ruby!

Я немного поиграл с irb и увидел остаток с плавающей запятой, разделенный на целое число больше самого себя вернуть сам поплавок. например, 2.5 % 5 вернул 2.5.

Я ожидал, что результатом вышеприведенного уравнения будет 0, поскольку, если мы разделим 2.5 на 5, ответ будет 0.5, а остаток 0.

Можете ли вы помочь мне понять, почему это поведение или я математически неправ? Заранее спасибо

Ответы [ 3 ]

1 голос
/ 19 января 2020

Вы математически не правы: 2.5 делится на 5 это не 5. Это 0.5. Или, если вы говорите о «целочисленном делении» (то есть делении, где результатом всегда является целое число), результат равен 0. 0 * 2.5 равно 0, следовательно, остаток равен 2.5.

На самом деле это верно для любой пары чисел a и b, где b > a что a % b == a.

0 голосов
/ 20 января 2020

do c для Numeric #% заявляет: «x.modulo(y) означает x-y*(x/y).floor». В вашем примере это означает:

2.5 % 5
  #=> 2.5 - 5*(2.5/5).floor
  #=> 2.5 - 5*(0.5.floor) => 2.5 - 5 * 0 => 0.5

Рассмотрим еще четыре примера.

9 % 2.0
  #=> 9 - 2.0*(9/2.0).floor
  #=> 9 - 2.0*(4.5.floor) => 9 - 2.0*4 => 1.0
9.0 % 2
  #=> 9.0 - 2*(9.0/2).floor
  #=> 9.0 - 2*(4.5.floor) => 9.0 - 2.0*4 => 1.0
9.0 % 2.0
  #=> 9.0 - 2.0*(9.0/2.0).floor
  #=> 9.0 - 2.0*(4.5.floor) => 9.0 - 2.0*4 => 1.0
9 % 2
  #=> 9 - 2*(9/2).floor
  #=> 9 - 2*(4.floor) => 9 - 2*4 => 1

do c для Float #% (он же Float#modulo) приводит еще два примера:

6543.21 % 137
  #=> 6543.21 - 137*((6543.21/137).floor)
  #=> 6543.21 - 137*(47.76065693430657.floor)
  #=> 6543.21 - 137*47
  #=> 104.21000000000004 
6543.21 % 137.24
  #=> 6543.21 - 137.24*((6543.21/137.24).floor)
  #=> 6543.21 - 137.24*(47.67713494607986.floor)
  #=> 6543.21 - 137.24*47
  #=> 92.92999999999961
0 голосов
/ 19 января 2020

% - это оператор по модулю (В вычислениях операция по модулю находит остаток после деления одного числа на другое (так называемый модуль операции). В вашем случае это правильно: 2,5% 5 = 2,5

/ - это деление 2.5 / 5 = 0.5

Как только вы включите одно число в число с плавающей точкой, в этом случае 2.5, Ruby автоматически преобразует результат в число с плавающей точкой, даже если другое число является строкой.

Надеюсь, это поможет, Август

...