最近使用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;
结果:
哎,里面有好多容易被忽略的坑啊。。。