本文實例講述了MySQL中ROUND函數(shù)進行四舍五入操作陷阱。,具體如下:
在MySQL中, ROUND 函數(shù)用于對查詢結果進行四舍五入,不過最近使用ROUND函數(shù)四舍五入時意外發(fā)現(xiàn)并沒有預期的那樣,本文將這一問題記錄下來,以免大家跟我一樣犯同樣的錯誤。
假如我們有如下一個數(shù)據(jù)表 test ,建表語句如下
| CREATE TABLE test ( id int(11) NOT NULL AUTO_INCREMENT, field1 bigint(10) DEFAULT NULL, field2 decimal(10,0) DEFAULT NULL, field3 int(10) DEFAULT NULL, field4 float(15,4) DEFAULT NULL, field5 float(15,4) DEFAULT NULL, field6 float(15,4) DEFAULT NULL, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
我們創(chuàng)建了一個名為 test 的表,出了 id 字段之外還包含了多個字段,擁有這不同的數(shù)據(jù)類型。我們向這個表中插入一條數(shù)據(jù)
| INSERT INTO test (field1, field2, field3, field4, field5, field6) VALUE (100, 100, 100, 1.005, 3.5, 2.5); |
插入之后表中的數(shù)據(jù)是這樣的
| mysql> select * from test;+----+--------+--------+--------+--------+--------+--------+| id | field1 | field2 | field3 | field4 | field5 | field6 |+----+--------+--------+--------+--------+--------+--------+| 1 | 100 | 100 | 100 | 1.0050 | 3.5000 | 2.5000 |+----+--------+--------+--------+--------+--------+--------+1 rowin set (0.00 sec) |
如果現(xiàn)在我們執(zhí)行下面這個SQL,你覺得結果會是什么樣的呢?
| SELECT round(field1 * field4), round(field2 * field4), round(field3 * field4), round(field1 * 1.005), round(field2 * 1.005), round(field3 * 1.005), round(field5), round(field6)FROM test; |
最初一直以為這樣的結果肯定是都是 101 ,因為上面這六個取值結果都是對 100 * 1.005 進行四舍五入,結果肯定都是 101 才對,而后面兩個肯定是 4 和 3 才對,但是最終的結果卻是與設想的大相徑庭
| *************************** 1. row ***************************round(field1 * field4): 100round(field2 * field4): 100round(field3 * field4): 100 round(field1 * 1.005): 101 round(field2 * 1.005): 101 round(field3 * 1.005): 101 round(field5): 4 round(field6): 21 rowin set (0.00 sec) |
同樣是100*1.005,為什么從數(shù)據(jù)庫中的字段相乘得到的結果和直接字段與小數(shù)相乘得到的不一樣呢?
對這個問題百思不得其解,各種百度谷歌無果。。。沒辦法,還得靠自己,這個時候最有用的就是官網文檔了,于是查詢了mysql官方文檔中關于ROUND函數(shù)的部分,其中包含下面兩條規(guī)則
For exact-value numbers, ROUND() uses the “round half up” rule(對于精確的數(shù)值, ROUND 函數(shù)使用四舍五入) 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函數(shù)庫,在很多系統(tǒng)中新聞熱點
疑難解答
圖片精選