Mysql乗算の割り算精度の不一致問題(除算後4桁小数)
問題
今日はプロジェクト機能を書く時、統計金額があります。単位転換が必要です。大体以下のような機能の文を書きましたが、得られたデータは小数点以下の4桁の精度です。正常には2桁で十分です。
テスト
バグと未知の状況をテストします。必ず必要です。 最小再现、他の文が结果に干渉することを防止するために简単なテストを行います。
select 1/100
//0.0100を得る
select 1*0.01
//得0.01
そして3/4台の設備で運行しています。mysqlのバージョンによって環境が違います。
だから知っています Mysqlでは、乗算と除算は小数点以下の精度に不一致です。
国内のフォーラムで適当な資料が見つからなかったので、外国のフォーラムで探して、質問して、交流しました。
答え
まず他の先輩の問題に対する解答と指導に感謝します。私達もできるだけ詳しく記録します。
文明が続くのは、記憶があるからです。文章ももっと多くの友達に役に立ちますように。除算の精度は、デフォルトでは小数点以下4桁 です。乗算の精度使用 操作数の精度と方式で判断します。例のように 1*0.01精度はそれぞれ小数点以下0桁と2桁です。 0+2=2の結果も2ビット精度 を使用します。
テスト
select 1.00*0.01
//結果0.0100
控訴の結論に合致する。海外の先輩のご指導に感謝します。
除算には2ビット精度を使用します。
私たちの問題が除算で解決することを堅持するなら、関数を使って変換精度を行うことができます。
CAST(@x/@y AS DECIMAL(m,n)
DECIMALのパラメータはこれを見てもいいです。基本的にテーブル構造を作成したものは全部分かります。
@xと@yは除数と除数です。
また、私たちはmysqlにデフォルトの割り算精度を設定できるかどうかについても質問します。毎回sqlを関数で計算しなくてもいいです。
予想外の状況になりたくないなら、毎回タイプ転換を強制的に使う必要があります。
mysql関連説明文献
https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html
In division performed with/the scale of the result when using two exact-value operands is the scale of the first operand plus the value of the div uprecision_increment system variable(which is 4 by default).For example,the reult of the expressition 5.05/0.014 has a scale of six decimal places(360.714286)
除法の精度規則
上記の文献から分かります。二つの数値を使って計算すると、結果の精度は 最初の操作数の精度+システム変数div_precision_incrementの値は私達の例では1精度が0であり、システム変数の精度が4桁のデフォルトですので、4桁の精度が得られます。
set div_precision_increment=2
//select 1/100を再実行します。0.01を取得したい結果に適合しています。
したがって、標準変数を変更することで、除算のデフォルト精度を変更することもできます。
この時またテストします。
select 1.0/100
//結果0.010は上記の結論に合致する。
締め括りをつける
ここで、Mysql乗算の割り算精度が不一致です。除法後、4桁の小数点以下の文章をここに紹介します。もっと関連するmysqlの割り算精度の内容は以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。
今日はプロジェクト機能を書く時、統計金額があります。単位転換が必要です。大体以下のような機能の文を書きましたが、得られたデータは小数点以下の4桁の精度です。正常には2桁で十分です。
select total_fee / 100 from orders
引き続き調査して資料を探して、精度の転換を行って、1周の資料を探してすべてあまり満足しないで、引き続きテストを行います。テスト
バグと未知の状況をテストします。必ず必要です。 最小再现、他の文が结果に干渉することを防止するために简単なテストを行います。
select 1/100
//0.0100を得る
select 1*0.01
//得0.01
そして3/4台の設備で運行しています。mysqlのバージョンによって環境が違います。
だから知っています Mysqlでは、乗算と除算は小数点以下の精度に不一致です。
国内のフォーラムで適当な資料が見つからなかったので、外国のフォーラムで探して、質問して、交流しました。
答え
まず他の先輩の問題に対する解答と指導に感謝します。私達もできるだけ詳しく記録します。
文明が続くのは、記憶があるからです。文章ももっと多くの友達に役に立ちますように。
テスト
select 1.00*0.01
//結果0.0100
控訴の結論に合致する。海外の先輩のご指導に感謝します。
除算には2ビット精度を使用します。
私たちの問題が除算で解決することを堅持するなら、関数を使って変換精度を行うことができます。
CAST(@x/@y AS DECIMAL(m,n)
DECIMALのパラメータはこれを見てもいいです。基本的にテーブル構造を作成したものは全部分かります。
@xと@yは除数と除数です。
また、私たちはmysqlにデフォルトの割り算精度を設定できるかどうかについても質問します。毎回sqlを関数で計算しなくてもいいです。
予想外の状況になりたくないなら、毎回タイプ転換を強制的に使う必要があります。
mysql関連説明文献
https://dev.mysql.com/doc/refman/8.0/en/arithmetic-functions.html
In division performed with/the scale of the result when using two exact-value operands is the scale of the first operand plus the value of the div uprecision_increment system variable(which is 4 by default).For example,the reult of the expressition 5.05/0.014 has a scale of six decimal places(360.714286)
除法の精度規則
上記の文献から分かります。二つの数値を使って計算すると、結果の精度は 最初の操作数の精度+システム変数div_precision_incrementの値は私達の例では1精度が0であり、システム変数の精度が4桁のデフォルトですので、4桁の精度が得られます。
set div_precision_increment=2
//select 1/100を再実行します。0.01を取得したい結果に適合しています。
したがって、標準変数を変更することで、除算のデフォルト精度を変更することもできます。
この時またテストします。
select 1.0/100
//結果0.010は上記の結論に合致する。
締め括りをつける
ここで、Mysql乗算の割り算精度が不一致です。除法後、4桁の小数点以下の文章をここに紹介します。もっと関連するmysqlの割り算精度の内容は以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。