DB2之DECIMAL小数位数导致的乘法溢出

来源:互联网 发布:胜利足球数据库 编辑:程序博客网 时间:2024/05/01 18:16

 

 DECIMAL值类型最长为31位,它在做乘法运算的时候,会将小数位数自动加和而挤占整数位,直到挤占完毕导致结果溢出。

比如A:DECIMAL(24,6) ;B:DECIMAL(24,6);则A*B的结果是DECIMAL(31,12)

比如A:DECIMAL(5,2) ;B:DECIMAL(6,3);则A*B的结果是DECIMAL(11,5)

 

 

依次类推,如果有5个DECIMAL(24,6)乘数相乘,乘法的结果为30位小数,如果此时再继续乘以某个数值使其结果大于1,DB2将挤占直到31位小数DB2 也将报错:

SELECT 1.1*CAST(1 AS DECIMAL(24,6))*CAST(1 AS DECIMAL(24,6))*CAST(1 AS DECIMAL(24,6))*CAST(1 AS DECIMAL(24,6))*CAST(1 AS DECIMAL(24,6)) FROM BUSINESS_CONTRACT FETCH FIRST 1 ROWS ONLY

SQLSTATE 22003: A numeric value is out of range.

 SQL0802N  发生算术溢出或其他算术异常。  SQLSTATE=22003

不信各位可以试试。

 

解决的办法是,在每一次乘法计算完毕后,都对计算结果进行一下 CAST()修正,

如:CAST(6.02*3.36  AS DECIMAL(24,2))

 

原创粉丝点击