您好,登錄后才能下訂單哦!
這篇文章主要介紹如何解決Mysql乘法除法精度不一致問題,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
問題
今天在寫項目功能的時候,有一個統計金額的情況,然后需要進行單位轉換,所以寫下了大概如下功能的語句,但得到的數據為小數點后4位精度,正常我們只需要2位就足夠。
select total_fee / 100 from orders
繼續排查尋找資料,進行精度轉換,找了一圈的資料都不太滿意,繼續進行測試
測試
測試bug和未知情況,我們一定要 最小復現,精簡測試 ,防止其他語句對結果產生干擾。
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_precision_increment system variable (which is 4 by default). For example, the result of the expression 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乘法除法精度不一致問題”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。