如何在Rails应用程序中添加BigDecimal值

时间:2012-03-03 02:50:50

标签: ruby-on-rails

在Rails 3.2应用程序中,我定义了两种执行计算并返回一个大十进制值的方法。

Def Func1
  Model1.price * Model1.qty
End 

Def Func2
   Model2.price * Model2.qty
End

我不知道这是否相关,但是:qty字段是一个记录相关has_many记录数的计数器缓存列。

我现在想要计算Func1和Func2的总和。如果我试试

Def FuncTotal
   Func1 + Func2
End 

它返回连接的两个值,而不是总和。即如果Func1 = 15.45且Func2 = 24.76,则FuncTotal = 15.4524.76。

我也试过

Def FuncTotal
   Func1.to_s + Func2.to_s
End

但这也是连接起来的。

我认为发生此问题是因为计算基于BigDecimal值。在这种情况下,我觉得价格*数量计算返回正确的产品似乎很奇怪。

如何将两个BigDecimal值一起添加?

非常感谢

修改

这是一个示例控制台输出

> 1=Model1.find(1)
=> #<Model1 id:1......
> 2.Model2.find(2)
=> #<Model2 id:2....
> 1total=1.func1
=> [#<BigDecimal:10a5cd888,'0.25E4',9(36)>] 
> 2.total=2func2
=> [#<BigDecimal:10a5c7348,'0.5E3',9(36)>]
> 1+2
=> [#<BigDecimal:10a5cd888,'0.25E4',9(36)>, #<BigDecimal:10a5c7348,'0.5E3',9(36)>]

奇怪!

修改

我的列定义如下。

两种型号的价格相同

t.decimal  "price",  :precision => 12, :scale => 2

两种型号的数量大致相同

t.integer  "model1_children_count", :default => 0

并在儿童模型中

belongs_to :model1, :counter_cache => true

修改

完整的Func1和Func2如下所示,位于has_many Model1s和Model2s的父模型中。

Class Parent
  def total_cost_of_model1
    model1s.collect { |model1s| model1.price * model1.quantity }
  end
end

2 个答案:

答案 0 :(得分:2)

您的总成本函数调用collect,它返回一个数组,当连接时将返回一个连接数组。如果要使用“+”

添加它,则必须返回正确的类型(BigDecimal)

答案 1 :(得分:0)

你确定他们是BigDecimals吗?我实际上在这里得到了正确的行为。

irb(main)> a = BigDecimal.new("1")
=> #<BigDecimal:102773230,'0.1E1',9(18)>
irb(main)> b = BigDecimal.new("2")
=> #<BigDecimal:100dd1a48,'0.2E1',9(18)>
irb(main)> c = a + b
=> #<BigDecimal:1026502e0,'0.3E1',9(27)>
irb(main)> c.to_i
=> 3