MySQL の DOUBLE と DECIMAL の違い 質問する

MySQL の DOUBLE と DECIMAL の違い 質問する

わかりました。MySQL データベースにお金を格納するのに DOUBLE を使用するべきではない、そうしないと厄介な精度のバグが発生する、という記事がたくさんあることはわかっています。重要なのは、新しいデータベースを設計しているのではなく、既存のシステムを最適化する方法を見つけることを求められているということです。新しいバージョンには 783 個の DOUBLE 型の列が含まれており、そのほとんどはお金や金額を計算する数式を格納するために使用されます。

したがって、この件に関する私の最初の意見は、MySQL のドキュメントや誰もがそう言っているので、次のバージョンでは DOUBLE から DECIMAL への変換を強く推奨すべきだというものでした。しかし、次の 3 つの理由から、この推奨を正当化する十分な根拠を見つけることができませんでした。

  • データベース上で計算は実行しません。すべての操作は BigDecimal を使用して Java で実行され、MySQL は結果の単純なストレージとしてのみ使用されます。
  • DOUBLE が提供する 15 桁の精度は、主に 2 桁の小数点付きの金額と、数式の引数として 8 桁の小数点付きの小さな数値を格納するため、十分です。
  • 当社は、MySQL 側の精度の低下によるバグの問題が知られていない、6 年間の運用実績を持っています。

1800万行のテーブルでSUMや複雑な乗算などの操作を実行しても、精度不足のバグは発生しませんでした。また、実際にはこのような操作は実行されません。次のようにすると、精度の低下を確認できます。

SELECT columnName * 1.000000000000000 FROM tableName;

しかし、小数点第 2 位の数字でこれをバグに変える方法がわかりません。インターネットで見つけた実際の問題のほとんどは、2005 年以前のフォーラムのエントリであり、5.0.51 MySQL サーバーではいずれも再現できませんでした。

したがって、SQL 算術演算を実行しない限り (実行する予定はありません)、DOUBLE 列に金額のみを格納および取得することで、何か問題が発生することは予想されますか?

ベストアンサー1

実際はまったく異なります。DOUBLE では丸めの問題が発生します。 のような操作を行うと、0.1 + 0.2のような結果になります0.30000000000000004。個人的には、浮動小数点演算を使用する財務データは信頼しません。影響は小さいかもしれませんが、誰にもわかりません。特に金銭の値を扱う場合は、近似値のデータよりも、信頼できるとわかっているデータの方が望ましいです。

おすすめ記事