msyql round函數隱藏問題

1.背景mysql

在用mysql round進行四捨五入計算的時候若是參與計算的字段爲float,則最終計算出的四捨五入效果會有很大出入。例子我就不列舉了sql

2.緣由app

mysql官方文檔中關於ROUND函數的部分,其中包含下面兩條規則函數

For exact-value numbers, ROUND() uses the 「round half up」 rule(對於精確的數值, ROUND 函數使用四捨五入)
For approximate-value numbers, the result depends on the C library. On many systems, this means that ROUND() uses the 「round to nearest even」 rule: A value with any fractional part is rounded to the nearest even integer. (對於近似值,則依賴於底層的C函數庫,在不少系統中 ROUND 函數會使用「取最近的偶數」的規則)
經過這兩條規則,咱們能夠看出,因爲咱們在使用兩個字段相乘的時候,最終的結果是按照 float 類型處理的,而在計算機中 float 類型不是精確的數,所以處理結果會按照第二條來,而直接整數字段與1.005這樣的小數運算的結果是由於兩個參與運算的值都是精確數,所以按照第一條規則計算。從 field5 和 field6 執行 ROUND 函數的結果能夠明確的看確實是轉換爲了最近的偶數。this

3.總結
從這個例子中能夠看到,在MySQL中使用ROUND仍是要很是須要注意的,特別是當參與計算的字段中包含浮點數的時候,這個時候計算結果是不許確的。

spa

4.解決辦法:rest

SELECT CAST(計算結果 as decimal(10,2)) FROM XXX
相關文章
相關標籤/搜索