Ruby语言好奇整数算法:(-5/2)!=-(5/2)

Dmi*_*iev 9 ruby integer

我花了一些时间完成一个关于拆分数组的非常简单的任务。直到我发现: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 
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 14

为什么会这样?

除了正在查找的答案之外,还不清楚您正在寻找什么样的答案(我的粗体强调):

15.2.8.3.4 Integer#/

/(其他)

  • 公开程度:公开
  • 行为
    • a)如果other是该类的实例Integer
      • 1)如果other的值为0,则引发该类的直接实例ZeroDivisionError
      • 2)否则,令n为接收器的值除以other的值。返回该类的实例,该实例的Integer 值是小于或等于n的最大整数
        注意即使接收器的值为负,其行为也相同。例如,-5 / 2return-3

如您所见,该规范甚至包含您的确切示例。

它也在Ruby / Spec中指定:

it "supports dividing negative numbers" do
  (-1 / 10).should == -1
end
Run Code Online (Sandbox Code Playgroud)

将此与Float#to_i粗体强调)的规范进行比较:

15.2.9.3.14 Float#to_i

to_i

  • 公开程度:公开
  • 行为:该方法返回该类的实例,Integer其值是接收者的整数部分

Ruby / Spec中

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
Run Code Online (Sandbox Code Playgroud)