真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何解決Mysql乘法除法精度不一致問題

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

創(chuàng)新互聯(lián)公司從2013年成立,先為順德等服務(wù)建站,順德等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為順德企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

問題

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

select total_fee / 100 from orders

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

測試

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

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

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

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

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

答案

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

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

  • 除法的精度默認(rèn)是小數(shù)點后4位

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

測試

select 1.00 * 0.01;
// 結(jié)果 0.0100

符合上訴結(jié)論。感謝國外前輩指教。

除法使用2位精度

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

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

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

@x和@y就是除數(shù)和被除數(shù)。

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

前輩回復(fù):如果你不想有時候出現(xiàn)出乎意料的情況,那么需要每次都強制使用類型轉(zhuǎn)換。

mysql相關(guān)說明文獻(xiàn)

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

除法的精度規(guī)則

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

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

所以我們還可以通過修改默認(rèn)變量,來改變除法的默認(rèn)精度。

此時我們再測試

select 1.0 / 100;
// 結(jié)果 0.010 符合上文所述結(jié)論

以上是“如何解決Mysql乘法除法精度不一致問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文標(biāo)題:如何解決Mysql乘法除法精度不一致問題
新聞來源:http://weahome.cn/article/johiei.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部