DB2 CAST()函数,(CAST AS DECIMAL)

最近使用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;

结果:

 

 哎,里面有好多容易被忽略的坑啊。。。

 

posted @ 2022-03-08 15:09  wlv1314  阅读(2771)  评论(0编辑  收藏  举报