[解決済み] 10進数の列にお金を格納する - どのような精度とスケール?[クローズド]
質問
データベースでお金の値を格納するために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年版の『確率と誤差の理論』では「コンピュータの法則」(コンピュータとは計算をする人間のこと)と呼ばれていた。
関連
-
[解決済み] C#でお金に使うデータ型は何が良いのか?
-
[解決済み] SQL Server FOR EACH ループ
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] Oracleの全テーブルのリストを取得しますか?
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] SQL/mysql - Select distinct/UNIQUE but return all column?
-
[解決済み] Postgres でサブクエリを使用してテーブルの行を更新する
-
[解決済み] データベースのカラムに区切りリストを格納することは、本当に悪いことなのか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAクラスタエラーサマリーの構築
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] 1つのPostgreSQLクエリで複数のWITHステートメントを使用するには?
-
[解決済み] アドホッククエリとは何ですか?
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] SQL Serverでは、MONEYとDECIMAL(x,y)のどちらをデータ型として選択すべきでしょうか?
-
[解決済み] データベースフィールドの標準的な長さのリスト
-
[解決済み] 通貨/お金の取り扱いについて、最適な方法を教えてください。
-
[解決済み】なぜ.NETはデフォルトで銀行員の丸めを使用するのですか?