2010-09-28 79 views
5

我應該如何使用MongoID與Money合作?我應該將其配置爲BigDecimal嗎?在軌道水平?對於ActiveRecord,我們有一些叫做Money的東西,但是AFAIK它只支持ARmongoid中的貨幣表示

+0

錢是什麼? – shingara 2010-09-28 15:41:54

+0

像小數,int,float ... – luckytaxi 2010-09-28 15:53:59

+0

dm是對的。切勿使用浮點數來表示金錢(如花車,雙打)。這會造成很多麻煩。在演示過程中您將損失美分。例如10.2可以表示爲10.19999(9)。在舍入和不同的算術運算期間,你將會遇到越來越多的錯誤[爲什麼不用double來表示貨幣](http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency/3730040#3730040) – Dao 2011-04-13 18:43:04

回答

3

MongoDB將數字存儲在各種BSON數據類型(int,long int,double)中。我建議您將貨幣存儲爲美分(如果是美元貨幣)並使用long int數據類型。

7

我也碰到過這個。不幸的是BigDecimal在Mongodb中作爲一個字符串存儲,所以它不會讓你像float或int那樣對它進行求和,排序等。

整數似乎走在仙存儲的值,可能用這些錢寶石抽象了一點的方式:https://github.com/RubyMoney/money

蒙戈存儲上使用最現代化的機器我是這麼認爲的有64位整型即使以美分計算,也不需要大量的風險。看起來您可以存儲-9,223,372,036,854,775,808和9,223,372,036,854,775,807美分之間的數字,因此請取下兩位小數,以美元計算您的最小/最大值。

http://en.wikipedia.org/wiki/Integer_(computer_science)

2

如果你喜歡錢寶石,你可以將它存儲爲錢類型。

一個例子:https://gist.github.com/michaelkoper/5007636

它存儲的錢作爲數組[美分,貨幣]

class Product 
    include Mongoid::Document 

    field :price, type: Money 
end 

product = Product.new(:price => Money.new(1000, 'EUR')) 
product.price.format 
# => "€10.00"