Mysql不同版本cast/truncate函數對浮點型的處理

我們不妨先來看一個現象

select cast(1/5 as decimal(4,2));

我們先盲猜一下這條SQL的運行結果,如果按照我們的一貫經驗,那應該是
0.20,畢竟我們as decimal(4,2)是保留兩位小數的。但是實際上並不一定是。
在不同的mysql版本下執行了這條sql:

select cast(1/5 as decimal(4,2)) as res,version() as v;

得到的結果如下:

5.6.455.6.365.6.39三個小版本中的表現,不論是cast還是truncate函數,對能整除的操作的保留兩位小數
得到的結果都是無法保留末尾是0的小數的,末尾的0會自動被捨棄。

5.7.228.0.15這兩個版本表現完全是另一種結果,執行以下SQL:

select cast(1/5 as decimal(4,2)) as castRes,truncate(1/5,2) as truncateRes;

得到的結果都是0.20

某次開發過程中遇到了這個Bug,不得其解,記錄一下,以示後來人。不過我們也由此得出一個準則,數據格式的format處理還是
儘可能的交給程序去處理,而不是mysql。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章