MySQL 之 ROUND 函式四捨五入的陷阱

2021-08-22 19:15:14 字數 1966 閱讀 3216

round(field1 * field2 +0.0000001),這樣在要計算的值後面加上乙個對最後結果沒影響的很小的數字,就能正確的四捨五入了
問題描述

假如我們有如下乙個資料表 test ,建表語句如下

createtabletest (

idint(11) not null auto_increment,

field1bigint(10) default null,

field2decimal(10,0) default null,

field3int(10) default null,

field4float(15,4) default null,

field5float(15,4) default null,

field6float(15,4) default null,

primarykey (id)

) engine=innodbdefault charset=utf8;

我們建立了乙個名為 test 的表,出了 id 字段之外還包含了多個字段,擁有這不同的資料型別。我們向這個表中插入一條資料

insertintotest (field1, field2, field3, field4, field5, field6) value (100, 100, 100, 1.005, 3.5, 2.5);

插入之後表中的資料是這樣的

mysql> select * fromtest;

+—-+——–+——–+——–+——–+——–+——–+

| id | field1 | field2 | field3 | field4 | field5 | field6 |

+—-+——–+——–+——–+——–+——–+——–+

| 1 | 100 | 100 | 100 | 1.0050 | 3.5000 | 2.5000 |

+—-+——–+——–+——–+——–+——–+——–+

1 rowin set (0.00 sec)

如果現在我們執行下面這個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)

fromtest;

最初一直以為這樣的結果肯定是都是 101 ,因為上面這六個取值結果都是對 100 * 1.005 進行四捨五入,結果肯定都是 101 才對,而後面兩個肯定是 4 和 3 才對,但是最終的結果卻是與設想的大相徑庭

*****************1. row*****************

round(field1 * field4): 100

round(field2 * field4): 100

round(field3 * field4): 100

round(field1 * 1.005): 101

round(field2 * 1.005): 101

round(field3 * 1.005): 101

round(field5): 4

round(field6): 2

1 rowin set (0.00 sec)

為什麼會這樣?

同樣是100*1.005,為什麼從資料庫中的字段相乘得到的結果和直接欄位與小數相乘得到的不一樣呢?

總結 從這個例子中可以看到,在mysql中使用round還是要非常需要注意的,特別是當參與計算的字段中包含浮點數的時候,這個時候計算結果是不準確的。

MySQL中round 四捨五入之坑

計算數值時,因將乙個數值由 四捨五入改成sql四捨五入做整數處理而產生了誤差。該字段為varchar型別,修改後的計算結果與之前的結果當小數字為.5四捨五入進製時,竟然出現誤差。例如2.5,當欄位型別為varchar或double型別時,使用round函式,結果為2,而decimal則進製正常。執行...

SQL的四捨五入ROUND函式

sql四捨五入2007 11 01 16 35問題1 select cast 123.456 as decimal 將會得到 123 小數點後面的將會被省略掉 如果希望得到小數點後面的兩位。則需要把上面的改為 select cast 123.456 as decimal 38,2 123.46 自動...

MS SQL的ROUND函式用來數值的四捨五入

ms sql的round函式用來數值的四捨五入 ms sql要進行數值的四捨五入,有一好用的函式round。語法 round numeric expression length function 引數numeric expression 精確數值或近似數值資料類別 bit 資料型別除外 的表示式。l...