MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

MySQL の乗算と除算の精度の不一致の問題 (除算後の小数点以下 4 桁)

質問

今日、プロジェクト関数を書いていたとき、金額の統計計算を行い、単位を変換する必要がありました。そこで、次の関数に似たステートメントを書いたのですが、取得したデータは小数点以下 4 桁で、通常は 2 桁しか必要ありません。

select total_fee / 100 from orders

データの検索と精度変換を続けます。しばらく検索した後、データに満足できませんでした。テストを続けます

テスト

バグや未知の状況をテストするときは、再現を最小限に抑え、テストを合理化し、他のステートメントが結果に干渉しないようにする必要があります。

1/100を選択します。
// 0.0100 を取得
1 * 0.01を選択します。
// 0.01 を取得

また、3/4 台のデバイスで実行され、異なる MySQL バージョン環境でも同じ結果が得られます。

したがって、MySQL では、乗算と除算の小数点以下の精度が異なることがわかります。

国内のフォーラムでは適切な情報が見つからなかったので、海外のフォーラムに行って情報を探したり、質問したり、コミュニケーションをとったりしました。

答え

まずは、他の先輩方の回答とアドバイスに感謝したいと思います。また、問題のトラブルシューティングを可能な限り詳細に記録します。

文明は記憶を持っているからこそ生き残るのです。この記事がより多くの友人の役に立つことを願っています。

  • 除算のデフォルトの精度は小数点以下 4 桁です。
  • 乗算の精度は、オペランドの精度の合計によって決まります。たとえば、例では、1*0.01 の精度は小数点以下 0 桁と 2 桁なので、0+2 = 2 でも 2 桁の精度が使用されます。

テスト

1.00 * 0.01を選択します。
// 結果 0.0100

控訴の結論と一致します。ご指導いただいた外国人の先輩方に感謝いたします。

除算は2桁の精度を使用します

問題を解くためにどうしても除算を使用する必要がある場合は、精度を変換する関数を使用できます。

CAST( @x / @y を DECIMAL(m,n) として)

DECIMAL のパラメータは Baidu で調べることができます。基本的にテーブル構造を作成したことがある人なら誰でも理解できます。

@x と @y は除数と被除数です。

同時に、SQL で毎回関数計算を使用しなくても済むように、MySQL でデフォルトの除算精度を設定できるかどうかも疑問に思いました。

先輩の回答: 予期しない状況が時々発生するのを避けたい場合は、毎回型変換を強制する必要があります。

MySQL関連のドキュメント

https://dev.mysql.com/doc/refman/8.0/en/算術関数.html

/ を使用して実行される除算では、2 つの正確な値のオペランドを使用した場合の結果のスケールは、最初のオペランドのスケールに div_precision_increment システム変数の値 (デフォルトでは 4) を加えたものになります。たとえば、式 5.05 / 0.014 の結果のスケールは小数点以下 6 桁 (360.714286) になります。

除算の精度ルール

上記の文献から、2 つの数値を計算に使用する場合、結果の精度は最初のオペランドの精度 + システム変数 div_precision_increment の値によって決まることがわかります。たとえば、この例の 1 の精度は 0 であり、システム変数の精度はデフォルトで 4 桁であるため、結果は 4 桁の精度になります。

div_precision_increment = 2 を設定します。
// もう一度 select 1 / 100 を実行し、目的の結果を満たす 0.01 を取得します。

したがって、デフォルトの変数を変更することで、除算のデフォルトの精度を変更することもできます。

今テストする

1.0 / 100 を選択します。
// 結果0.010は上記の結論と一致している

要約する

MySQL の乗算と除算の精度の不一致、および除算後の小数点以下 4 桁に関するこの記事はこれで終わりです。MySQL の乗算と除算の精度に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL のタイムスタンプ精度によって引き起こされた殺人事件の分析

<<:  JavaScriptの動作原理を理解しましょう

>>:  nginxリバースプロキシによるセッション障害の問題の解決策

推薦する

Jenkins は Docker イメージを構築し、Harbor ウェアハウスにプッシュします

目次DockerファイルドキュメントJenkins の設定Spring Boot プロジェクトでは、...

Tomcatを使用して共有ライブラリを設定し、同じjarを共有する

デプロイされるプロジェクトが増えるにつれて、Tomcat にデプロイされるリリース パッケージも増え...

ReactのEffectListの簡単な分析

目次EffectList コレクション最初のレンダリング時のEffectList EffectLis...

Vue cli開発に基づく外部コンポーネントVantのデフォルトスタイルの変更の詳細な説明

目次序文1. 少ない2. コンポーネントをインポートする3. 設定ファイルを変更するステップ1: l...

CSSはletter-spacingプロパティを通じて単語間の間隔を制御します。

letter-spacing プロパティ: 文字間のスペース (文字間隔) を増減します。このプロ...

Reactにおける制御されたコンポーネントと制御されていないコンポーネントの簡単な分析

目次制御されていないコンポーネント制御コンポーネント知らせ結論は制御されていないコンポーネントフォー...

HTML/CSS での空白処理とページ内の空白を保持する方法

HTML の空白ルールHTML では、コンテンツ内の複数のスペースは通常 1 つとみなされ、連続する...

Linux で TCP 接続の最大数をテストする方法

序文TCP サーバの最大同時接続数に関して、「ポート番号の上限が 65535 であるため、TCP サ...

データベースを削除せずにMySQLのすべてのテーブルを素早く削除する方法

この記事では、例を使用して、データベースを削除せずに MySQL 内のすべてのテーブルをすばやく削除...

Dockerコンテナの入退出方法の詳細な説明

1 Dockerサービスを開始するまず、docker サービスを開始する方法を知っておく必要がありま...

JS の効率的なマジック演算子の概要

JavaScript は現在、毎年新しいバージョンがリリースされており、より便利で効率的な新しい演算...

MySQL 5.7.16 無料インストール版のインストールと設定方法のグラフィックチュートリアル

この記事ではMySQL 5.7.16のインストールと設定方法を記録します。具体的な内容は以下のとおり...

JS WebSocketを使用して簡単なチャットを実装する方法

目次ショートポーリングロングポーリングウェブソケットコミュニケーションの原則シンプルな1対1チャット...

MySQL でサーバーのインストールを開始できない場合の解決策について簡単に説明します。

コンピュータに初めて MySQL をインストールする場合、通常このエラー メッセージは表示されません...

Docker+K8S クラスタ環境構築と分散アプリケーション展開

1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...