1. ホーム
  2. mysql

MySQL における DOUBLE と DECIMAL の比較

2023-07-12 11:46:03

質問

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 . 個人的には、浮動小数点演算を使用する金融データは信用しないことにしています。影響は小さいかもしれませんが、誰にもわかりません。特にお金の価値を扱っているときは、近似されたデータよりも、信頼できるデータであるとわかっているものを手に入れたいと思います。