我的Rails应用中的价格太准确了

时间:2012-05-09 19:23:27

标签: ruby-on-rails testing rspec currency invoice

我目前正在为有发票的工作构建内部网。我目前正在为它编写测试,以确保增值税总和正确等等。

我注意到,在一些数量上,Rails / Ruby似乎更准确,它需要。我明白了:expected there to be content "2586.6099999999997"。请注意099999999997何时应为1

在我的数据库迁移文件中,我有这个 - t.decimal :price, :precision => 8, :scale => 2

在我的测试中,我只想添加两个值9491637.61,这些值应该2586.61而不是2586.60999...

会出现什么问题?

我应该使用Decimal还是应该使用整数?

编辑:规范代码基本上只是这个page.should have_content(item1.price + 1637.61)。 item1正在使用FactoryGirl。

我在测试中手动输入949或949.00时遇到同样的问题page.should have_content(949 + 1637.61)

item1 = FactoryGirl.create(:item, :quantity => 1, :price => 949.00, :description => "macbook for 949")

1 个答案:

答案 0 :(得分:3)

听起来您的数据库列实际上正常运行,因为它是decimal列。问题出在您的规范代码中:

page.should have_content(item1.price + 1637.61)

因此,如果价格为949.00,它正在进行949.00 + 1637.61。请记住,这与您的数据库列无关,它只是ruby代码。因此949.00 + 1637.61被评估为将float(1637.61)添加到十进制值(949.00),该值返回一个浮点数,因此返回2586.60999。所以规范期待2586.60999,但视图显示2586.61(因为它们应该是十进制列)。

如果您可以在规范中使用字符串和固定值,那么这可能很容易解决:

page.should have_content("2586.61")

或者,您可以确保以十进制格式保存所有内容,例如:

page.should have_content(item1.price + BigDecimal.new("1637.61"))