国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

如何解決Mysql乘法除法精度不一致問(wèn)題

發(fā)布時(shí)間:2021-07-27 11:43 來(lái)源:億速云 閱讀:0 作者:小新 欄目: Mysql 歡迎投稿:712375056

這篇文章主要介紹如何解決乘法除法精度不一致問(wèn)題,文中介紹的非常詳細,具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

問(wèn)題

今天在寫(xiě)項目功能的時(shí)候,有一個(gè)統計金額的情況,然后需要進(jìn)行單位轉換,所以寫(xiě)下了大概如下功能的語(yǔ)句,但得到的數據為小數點(diǎn)后4位精度,正常我們只需要2位就足夠。

select total_fee / 100 from orders

繼續排查尋找資料,進(jìn)行精度轉換,找了一圈的資料都不太滿(mǎn)意,繼續進(jìn)行測試

測試

測試bug和未知情況,我們一定要 最小復現,精簡(jiǎn)測試 ,防止其他語(yǔ)句對結果產(chǎn)生干擾。

select 1 / 100;
// 得到 0.0100
select 1 * 0.01;
// 得到 0.01

并且在3/4臺設備上運行,不同mysql版本環(huán)境都是這樣子的結果。

所以初步得知 Mysql中,乘法和除法對小數點(diǎn)后的精度不一致

在國內的論壇中沒(méi)有找到合適的資料,于是到國外論壇尋找,提問(wèn),交流。

答案

首先感謝其他前輩對問(wèn)題的解答和指點(diǎn),我們也將盡量詳細地記錄問(wèn)題的排查。

文明之所以能延續,是因為它們有記憶。希望文章也能幫到更多的朋友。

  • 除法的精度默認是小數點(diǎn)后4位

  • 乘法的精度使用 操作數的精度和 的方式來(lái)判斷,如例子中的 1*0.01 精度分別是小數點(diǎn)后0位和2位,那么就是 0+2 =2 結果也將使用2位精度

測試

select 1.00 * 0.01;
// 結果 0.0100

符合上訴結論。感謝國外前輩指教。

除法使用2位精度

那么我們的問(wèn)題 如果是要堅持用除法解決,我們可以使用函數來(lái)進(jìn)行轉換精度,

CAST( @x / @y AS DECIMAL(m,n) )

DECIMAL的參數可以百度看這個(gè),基本創(chuàng )建過(guò)表結構的都能明白。

@x和@y就是除數和被除數。

同時(shí)我還提出疑問(wèn),是否能在mysql里設置默認除法精度,我們就可以不用每次sql都使用函數計算了。

前輩回復:如果你不想有時(shí)候出現出乎意料的情況,那么需要每次都強制使用類(lèi)型轉換。

mysql相關(guān)說(shuō)明文獻

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).

除法的精度規則

由上面引用的文獻可知:當使用兩個(gè)數值進(jìn)行計算時(shí),結果的精度由 第一個(gè)操作數的精度 + 系統變量div_precision_increment的值決定 ,如我們例子中的1 精度是0,系統變量精度是4位默認,所以得到的結果是4位精度

set div_precision_increment = 2;
// 再運行select 1 / 100; 得到 0.01 符合想要的結果

所以我們還可以通過(guò)修改默認變量,來(lái)改變除法的默認精度。

此時(shí)我們再測試

select 1.0 / 100;
// 結果 0.010 符合上文所述結論

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

99热精国产这里只有精品| 日韩少妇内射免费播放| 亚洲人成手机电影网站| 成人久久精品一区二区三区| 亚洲精品国产综合麻豆久久99| 国产丝袜在线精品丝袜不卡|