MySQL における DOUBLE と DECIMAL の比較
質問
MySQL データベースにお金を格納するために DOUBLE を使用すべきではない、またはトリッキーな精度バグで終わるという記事が大量にあることは知っています。重要なのは、私は新しいデータベースを設計しているのではなく、既存のシステムを最適化する方法を探しているのです。新しいバージョンでは、783のDOUBLE型カラムがあり、そのほとんどがお金や金額を計算するための式を格納するために使用されています。
そのため、この件に関する私の最初の意見は、次のバージョンで DOUBLE から DECIMAL への変換を強く推奨すべきだということでした。しかし、その後、3つの理由から、この推奨を正当化するための良い議論を見つけることができませんでした。
- 私たちはデータベース上でいかなる計算も行いません。すべての操作は BigDecimal を使用して Java で行われ、MySQL は結果のプレーン ストレージとして使用されるだけです。
- 私たちは主に小数点以下2桁の金額を保存し、時々、式の引数として小数点以下8桁の小さな数字を保存するので、DOUBLEが提供する15桁の精度は十分なものです。
- 私たちは、MySQL 側の精度の損失による既知の問題のバグはなく、6 年間の実運用実績があります。
1800万行のテーブルに対して、SUMや複雑な乗算などの演算を行っても、精度不足のバグは発生しませんでした。そして、このようなことを実際に本番で行うことはありません。次のようなことをすれば、失われた精度を示すことができます。
SELECT columnName * 1.000000000000000 FROM tableName;
しかし、小数点以下 2 桁でバグにする方法がわかりません。私がインターネットで見つけた実際の問題のほとんどは、2005 年およびそれ以前のフォーラムのエントリであり、5.0.51 MySQL サーバーではどれも再現できませんでした。
SQL の演算処理を実行しない限り (実行する予定はない)、DOUBLE カラムに金額を保存および取得することから予想される問題はありますか?
どのように解決するのですか?
実は全然違うんです。DOUBLEは丸めの問題が発生します。そして、もしあなたが以下のようなことをしたら
0.1 + 0.2
のようにすると、次のようなものが得られます。
0.30000000000000004
. 個人的には、浮動小数点演算を使用する金融データは信用しないことにしています。影響は小さいかもしれませんが、誰にもわかりません。特にお金の価値を扱っているときは、近似されたデータよりも、信頼できるデータであるとわかっているものを手に入れたいと思います。
関連
-
MySQLデータベースでvarchar型の数値の大きさを比較する方法
-
MySQLにおけるvarchar型とchar型の違い
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み] C#でDecimalをDoubleに変換する方法は?
-
[解決済み] 小数の値を小数点以下2桁まで表示するには?
-
[解決済み] 2倍値を小数点以下x桁に丸める処理を素早く行う。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
mysqlにおけるvarcharの日付比較とソートの実装
-
[解決済み】マルチパート識別子をバインドできませんでした。
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
[解決済み】マルチパート識別子をバインドできない
-
mysql5.7のインストールと、無料・長期利用を目的としたNavicateの導入プロセスについて
-
SQLステートメントエラーです。オペランドには 1 つのカラムを含める必要があります [括弧を追加せずに複数のフィールドをクエリする
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] MySQLデータベースのテーブルのサイズを取得する方法は?