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;

结果:

 

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM