Любопытная целочисленная арифметика на языке Ruby: (-5/2)! = - (5/2) - PullRequest
8 голосов
/ 20 сентября 2019

Я потратил некоторое время на довольно простую задачу по разбиению массива.Пока я не обнаружил, что: 2 == 5/2 и -3 == -5/2.Чтобы получить -2 мне нужно вынуть минус из скобок: -2 == -(5/2).Почему это происходит?Насколько я понимаю, результат округляется до наименьшего целого числа, но (-2.5).to_i == -2.Очень любопытно.

# https://www.codewars.com/kata/swap-the-head-and-the-tail/train/ruby
# -5/2 != -(5/2)
def swap_head_tail a
  a[-(a.size/2)..-1] + a[a.size/2...-(a.size/2)] + a[0...a.size/2] 
end 

1 Ответ

13 голосов
/ 20 сентября 2019

Почему это происходит?

Не совсем ясно, какой ответ вы ищете, кроме , потому что именно так он указан ( жирный шрифт выделено):

15.2.8.3.4 Integer#/

/( прочее )

  • Видимость : общедоступный
  • Поведение :
    • a) Если other является экземпляром класса Integer:
      • 1) Если значение other равно 0 , создайте прямой экземпляр класса ZeroDivisionError.
      • 2)В противном случае, пусть n будет значением получателя, деленным на значение other .Вернуть экземпляр класса Integer , значение которого является наибольшим целым числом, меньшим или равным n .
        ПРИМЕЧАНИЕ Поведение остается тем же, даже если получатель имеет отрицательное значениестоимость. Например, -5 / 2 возвращает -3.

Как видите, спецификация даже содержитваш точный пример.

Он также указан в Ruby / Spec :

it "supports dividing negative numbers" do
  (-1 / 10).should == -1
end

Сравните это со спецификацией для Float#to_i( жирный выделенный):

15.2.9.3.14 Float#to_i

to_i

  • Visibility : public
  • Поведение : метод возвращает экземпляр класса Integer, значение которого целочисленная часть получателя .

А в Рубин / Спец :

it "returns self truncated to an Integer" do
  899.2.send(@method).should eql(899)
  -1.122256e-45.send(@method).should eql(0)
  5_213_451.9201.send(@method).should eql(5213451)
  1.233450999123389e+12.send(@method).should eql(1233450999123)
  -9223372036854775808.1.send(@method).should eql(-9223372036854775808)
  9223372036854775808.1.send(@method).should eql(9223372036854775808)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...