因此对于这种模型方法:
def tax_rate
tax_rate = 0.0
tax_rate += STATE_TAX if state_taxable? #STATE_TAX = 0.1
tax_rate += IMPORT_TAX if imported? #IMPORT_TAX = 0.05
tax_rate
end
此测试失败:
@item.update_attributes({:state_taxable => true,
:imported => true,
:price => 32.19})
assert_equal 0.15, @item.tax_rate
我收到此错误:
<0.15> expected but was <0.15>.
但是,此测试将通过:
@item.update_attributes({:state_taxable => true,
:imported => false,
:price => 14.99})
assert_equal 0.1, @item.tax_rate
因此,当tax_rate为0.0 + 0.1 + 0.05时,我会收到错误,但在0.0 + 0.1或0.0 + 0.05时则不会。 0.15都是Floats,所以我看不出是什么造成了这种情况。我花了太长时间考虑这个,希望有人可以指出罪魁祸首是什么。先谢谢你们。
答案 0 :(得分:9)
浮点数无法准确表示;您需要做的是使用assert_in_delta
检查您是否在指定范围内。
像assert_in_delta 0.15, @item.tax_rate, 0.001
之类的东西应该这样做:它会检查你是否在预期值的0.001之内。
答案 1 :(得分:3)
恕我直言,你应该存储整数(以美分为单位)。
答案 2 :(得分:1)
我多次出现此错误,原因是他们不同的类。
尝试
assert_equal 0.15.class, @item.tax_rate.class
我相信它会说像
<float> expected but was <double>.
如果你这样做
assert_equal 0.15.to_float, @item.tax_rate.to_float
它可能会通过
答案 3 :(得分:0)
0.1
以及浮点算术中的其他数字cannot be represented exactly。因此,你应该使用类似的东西(我不是Ruby人):
assert_true abs(0.15 - @item.tax_rate) < 0.0001
一般来说,你不应该真的使用花车来换取金钱/货币:有很多非常令人讨厌的微妙问题会在裂缝之间赔钱。请参阅this question。