40

私は現在、小規模な金融関連プロジェクトのために MongoDB を学習および適用しています。


MongoDB in Actionを読むと、次のように書かれています。

BSON 数値型でよく発生する他の唯一の問題は、10 進数のサポートがないことです。これは、MongoDB に通貨値を格納する予定がある場合は、整数型を使用して値をセント単位で保持する必要があることを意味します。


私の金融関連製品にはいくつかの通貨価値が含まれますが、上記のステートメントについて少し混乱したり心配したりしています. ここに私の質問があります:

  1. 私のプロジェクトでdouble使用できますか?currency values
  2. それらに直接使用するとどうなりますか、または結果はどうなりdoubleますか?
  3. 金融商品に 10 進数型が必須である場合、MongoDB を使用するのは悪い考えですか?
  4. とはどういう意味you need to use an integer type and keep the values in centsですか? を保管する場合は、保管する1.34 dollars必要があるということ134 centsですか?
4

7 に答える 7

41

財務上の目的で正確な表現が必要な場合は、小数部分が丸め誤差の影響を受けるため、倍精度小数点または浮動小数点値は不適切です。特定の10進値は、バイナリベースの浮動小数点を使用して表すことができないため、概算する必要があります。

あまり技術的でないイントロについては、浮動小数点数の丸めの問題を参照してください。オタクになりたい場合は、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことを読んでください。

整数型(セント単位の値の格納)を使用することをお勧めします。これは、潜在的な丸め誤差を回避するためです。このアプローチは、MongoDBドキュメントで金銭データをモデル化するための「スケールファクターの使用」として説明されており、MongoDB3.2以前の一般的な回避策です。

MongoDB 3.4には、通貨データフィールドを操作するための正確な精度を提供する新しいDecimalBSONタイプが含まれています。

于 2012-07-18T13:28:19.367 に答える
4

Mongoose を使用している場合は、スキーマ定義で getter/setter 関数を使用できます。

function getDecimalNumber(val) {    return (val/1000000); }
function setDecimalNumber(val) {    return (val*1000000); }

次のようなスキーマ オブジェクトに適用できます。

balance: { type: Number, default: 0, get: getDecimalNumber, set: setDecimalNumber },

乗算/除算するゼロの数は、必要な精度によって異なります。

于 2014-03-16T22:04:58.217 に答える
4

MongoDB は最終的に 10 進数のサポートを追加したようですが、これを書いている時点ではこれは開発が終わったばかりですが、安定したバージョン (3.4?) ですぐに利用できるようになることを願っています。

https://jira.mongodb.org/browse/SERVER-1393

于 2016-06-09T05:51:53.620 に答える
3

この投稿が古いことは知っていますが、Googleで上位にランクされているので...

財務データを保存するための最良のソリューションは、MongoDB 自身がhttp://docs.mongodb.org/v2.6/tutorial/model-monetary-data/#monetary-value-exact-precisionで文書化しているように、正確な精度を使用することです。

{price: 9990, currency: "USD" }

また、データが必要な場合は、2 桁の精度が必要であると仮定して、100 で割るだけです。欠点は、常に同じ精度で作業する必要があることです。

于 2015-07-09T12:10:58.560 に答える