1. ホーム
  2. sql

[解決済み] 10進数の列にお金を格納する - どのような精度とスケール?[クローズド]

2022-04-15 07:02:09

質問

データベースでお金の値を格納するために10進数のカラムを使用していますが、今日、どのような精度とスケールを使用するべきかについて悩んでいました。

文字列は一定幅の方が効率が良いと言われているので、10進数の列も同じことが言えるのではと思いました。そうなのでしょうか?

また、どのような精度とスケールにすればよいのでしょうか?私は24/8の精度を考えていました。それはやりすぎでしょうか、不十分でしょうか、それとも大丈夫でしょうか?


これは私が決めたことです。

  • トランザクションテーブル自体にコンバージョンレート(該当する場合)をfloatとして格納する。
  • アカウントテーブルに通貨を格納する
  • 取引金額は DECIMAL(19,4)
  • 変換レートを使用するすべての計算は、私のアプリケーションによって処理されるので、丸めの問題を制御し続けることができます。

変換レートはほとんど参考値で、どうせ10進数にキャストするのだから、floatでも問題ないと思う。

皆さん、貴重なご意見をありがとうございました。

解決方法は?

一長一短ということであれば、私は DECIMAL(19, 4) がよく使われているようです(ググってみると証明されます)。これは、VBA/Access/Jet Currencyのデータ型に由来するもので、この言語における最初の固定小数点型であると私は考えています。 Decimal は、VB6/VBA6/Jet 4.0の「バージョン1.0」スタイル(つまり、完全には実装されていない)でしか登場しません。

の経験則は ストレージ 固定小数点以下の値については、丸めを考慮して、実際に必要な桁数よりも少なくとも1つ多く格納する必要があります。古い Currency という型をフロントエンドで DECIMAL(19, 4) と入力すると、バックエンドで Currency は元々バンカーズラウンドを示すのに対し DECIMAL(p, s) は切り捨てで丸めた。

を格納する際に、小数点以下が1つ増える。 DECIMAL ベンダーのデフォルトを使用するのではなく、独自の丸めアルゴリズムを実装することができます(.5で終わるすべての値がゼロから丸められることを期待しているデザイナーにとって、銀行の丸めは控えめに言っても心配なものです)。

そうですね。 DECIMAL(24, 8) は、やりすぎだと思うのですが。ほとんどの通貨は、小数点以下4桁か5桁で表示されます。私は、小数点以下8桁(またはそれ以上)の目盛りがある状況を知っています。 しかし、これは「通常の」金額(例えば小数点以下4桁)が比例配分された場合であり、小数点以下の精度はそれに応じて下げなければならないことを意味します(このような状況では浮動小数点型も検討する必要があります)。今時、小数点以下24桁の精度を要求するような大金持ちはいないでしょうしね :)

しかし、画一的なアプローチではなく、いくつかの調査をする必要があるかもしれません。デザイナーやドメインの専門家に、適用される可能性のある会計規則について尋ねてみてください。GAAP、EUなど。漠然とですが、EUの国家間送金では、小数点以下5桁に丸めるという明確なルールがあり、そのために DECIMAL(p, 6) を保存することができます。会計士は一般的に小数点以下4桁を好むようです。


PS SQL Server の MONEY データ型は、丸めの精度に深刻な問題があり、移植性などの他の考慮事項があるからです。参照 Aaron Bertrandのブログ .


マイクロソフトや言語設計者がバンカー丸めを選んだのは、ハードウェア設計者がそれを選んだからです[引用?]。例えばIEEE(Institute of Electrical and Electronics Engineers)の標準規格に明記されています。そして、数学者が好むからこそ、ハードウェア設計者はそれを選んだのです。参照 ウィキペディア 1906年版の『確率と誤差の理論』では「コンピュータの法則」(コンピュータとは計算をする人間のこと)と呼ばれていた。