最近使用DB2查詢金額的時候出現了一個精度問題:
原sql:
數據庫中金額單位是分,取出來變成元
select CAST(FEE AS DECIMAL(10,2))/100 as fee from NET.XXX_TABLE;
查詢結果:
是不是嚇了一跳!
這里又涉及到DECIMAL函數了
DECIMAL(10,2)是什么意思呢?
2-表示小數部分的位數,如果插入的值未指定小數部分或者小數部分不足兩位則會自動補到2位小數,若插入的值小數部分超過了2為則會發生截斷,截取前2位小數。
10-指的是整數部分加小數部分的總長度,也即插入的數字整數部分不能超過“10-2”位,否則不能成功插入,會報超出范圍的錯誤。
分析過程:
以第一條數據310為例,310先保留2位小數變成了310.00,310.00/100=3.1000,至於為什么結果有好多0還沒搞明白!(歡迎大家指出)
修改sql:
那就先做除法在保留2位小數
select CAST(FEE/100 AS DECIMAL(10,2)) as fee from NET.XXX_TABLE;
結果:
這個時候精度丟了,第一條應該是3.10才對。
再次分析:
這個很容易被忽略:FEE=310,FEE/100這個除法 如果能整除那是沒問題的,一旦不能整除,得到的結果只是商,小數部分會被截斷,所以就成了3.00
再次修改sql:
那就先將310變成浮點型在做除法然后保留2位小數
select CAST((FEE*1.0)/100 AS DECIMAL(10,2)) as fee from NET.XXX_TABLE; 或者 select CAST(FEE/100.0 AS DECIMAL(10,2)) as fee from NET.XXX_TABLE;
結果:
哎,里面有好多容易被忽略的坑啊。。。