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))