2012-05-09 23 views
1

我目前正在建立一个有发票的工作的内联网。我目前正在编写测试,以确保增值税总结正确,等等。价格太准确在我的Rails应用程序

我注意到,在一些金额上,该Rails/Ruby似乎更准确,它需要。我得到这个:expected there to be content "2586.6099999999997"。当它应该是1时,请注意099999999997

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

在我的测试,我只是想加起来两个值,9491637.61应该总结2586.612586.60999...

会出现什么问题?

我应该使用十进制还是应该使用整数?

编辑:规范代码基本上只是这个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") 
+2

对于货币值,切勿使用浮动值。将金额存储为整数字段中的美分/分,或者以十进制类型存储。 –

+0

你能发布你的规范代码吗? –

+0

在问题 –

回答

3

这听起来像你的数据库列实际上就像它应该发挥作用,因为它是一个decimal列。问题是在规范的代码:

page.should have_content(item1.price + 1637.61) 

所以,如果价格是949.00,它做949.00 + 1637.61。请记住,这与您的数据库列无关,它只是ruby代码。因此949.00 + 1637.61正在评估为将浮点数(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")) 
+0

真棒,谢谢。只是一件事,我使用的是'number_to_currency',所以它为逗号','输入了超过999.99的值,就像你期望的那样,它具有'2,586.61',但是它试图找到'2586.61'并且失败。 –

+0

在这种情况下,您可能需要使用字符串方法,只需在“2,586.61”中使用硬编码,或者在spec文件中也使用'number_to_currency'助手(我不确定视图助手在规范中是否默认可用,但我敢肯定有一种方法) –

+0

你可以直接使用ActionController :: Base.helpers.number_to_currency(...)来访问它' –

相关问题