比较float数组时rspec测试的舍入问题

zol*_*ter 12 arrays testing floating-point rspec ruby-on-rails

我想检查一个结果的方法:

 result.should  == [1.0,2.0,3.0]
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

   expected: [1.0, 2.0, 3.0]
        got: [1.0, 2.0, 3.0] (using ==)
Run Code Online (Sandbox Code Playgroud)

我认为四舍五入的问题,但我不知道如何比较它们,例如偏差为0.1.

谢谢你,apneadiving.我写了自己的匹配器,如果它可以帮助某人:

RSpec::Matchers.define :be_closed_array do |expected, truth|
  match do |actual|
    same = 0
    for i in 0..actual.length-1
      same +=1 if actual[i].round(truth) == expected[i].round(truth)
    end
    same == actual.length
  end

  failure_message_for_should do |actual|
    "expected that #{actual} would be close to #{expected}"
  end

  failure_message_for_should_not do |actual|
    "expected that #{actual} would not be close to #{expected}"
  end

  description do
    "be a close to #{expected}"
  end
end
Run Code Online (Sandbox Code Playgroud)

apn*_*ing 13

使用:

 .should be_close
Run Code Online (Sandbox Code Playgroud)

甚至:

 .should be_within
Run Code Online (Sandbox Code Playgroud)

请参阅http://rubydoc.info/gems/rspec-expectations/2.4.0/RSpec/Matchers

  • 由于 RSpec 3 只实现了 `be_within`:http://www.rubydoc.info/gems/rspec-expectations/3.1.0/RSpec/Matchers#be_within-instance_method vs http://www.rubydoc.info/gems/ rspec-expectations/2.4.0/RSpec/Matchers#be_close-instance_method (3认同)