转换温度Ruby

时间:2018-01-06 16:56:32

标签: ruby rspec

我是一名Ruby初学者,目前正致力于学习如何使用RSpec。我也正在研究温度转换器,我已经让它通过了我的ftoc(华氏温度到摄氏温度)的RSpec测试,但是我在尝试通过ctof函数的最后一次测试时遇到了问题。当"体温"通过我的ctof方法传递,它应该返回一个值be_within(0.1).of(98.6),而我只能让它返回98并且测试没有通过。 be_within如何运作?如何在不影响其他测试的情况下获得所需的值(be_within(0.1).of(98.6))?

这是我的代码:

def ftoc(fahrenheit_degrees)
  celsius = (fahrenheit_degrees.to_i - 32) * 5.0 / 9.0
  celsius.round
end

def ctof(celsius_degrees)
  fahrenheit = (celsius_degrees.to_i * 9 / 5) + 32
  fahrenheit.round
end

这是我的RSpec代码:

describe "temperature conversion functions" do
  describe "#ftoc" do
    it "converts freezing temperature" do
      expect(ftoc(32)).to eq(0)
    end

    it "converts boiling temperature" do
      expect(ftoc(212)).to eq(100)
    end

    it "converts body temperature" do
      expect(ftoc(98.6)).to eq(37)
    end

    it "converts arbitrary temperature" do
      expect(ftoc(68)).to eq(20)
    end
  end

  describe "#ctof" do
    it "converts freezing temperature" do
      expect(ctof(0)).to eq(32)
    end

    it "converts boiling temperature" do
      expect(ctof(100)).to eq(212)
    end

    it "converts arbitrary temperature" do
      expect(ctof(20)).to eq(68)
    end

    it "converts body temperature" do
      expect(ctof(37)).to be_within(0.1).of(98.6)  #Here my problem  :/
    end 
  end
end

2 个答案:

答案 0 :(得分:2)

以下是对您的代码的一些想法:

  • 你不应该在结果上调用round;您可能希望使用round(1)将其四舍五入到小数位。

  • 您不应该在温度上调用to_i - 这样做,您将失去转换所需的信息(例如98.6将转换为98,97.9到97)。

  • 您的ctof正在使用9 / 5这是一个整数运算,将解析为1.您需要将这些操作数中的至少一个指定为浮点数(就像您在ftoc)(通过向其添加.0)来保证它将是浮点(而非整数)计算。

答案 1 :(得分:0)

您的问题似乎是您在ctof中进行整数除法而不是浮点除法:

37 * 9 / 5 + 32
# => 98
37 * 9.0 / 5 + 32
# => 98.6

你在ftoc中正确地执行此操作并且是编程中必须习惯的一个更奇怪的事情,划分2个整数将永远不会返回浮点(十进制)数。必须始终确保其中至少有一个是浮点数。

您也可能不想在方法的第二行(fahrenheit.round)上舍入这些值,或者至少要将多个小数位传递给round

(37 * 9.0 / 5 + 32).round
# => 99
(0.12345).round(3)
# => 0.123
(0.12345).round(1)
# => 0.1

另外,请查看this other question的答案,了解更多详情和一些替代解决方案。