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))
本文详细解释了DECIMAL类型在数据库中进行乘法运算时的位数限制,并提供了有效避免溢出错误的策略。通过实例演示了不同DECIMAL参数组合下的结果位数变化,以及如何在计算过程中使用CAST函数修正结果,确保数值计算的准确性。

1271

被折叠的 条评论
为什么被折叠?



