oracle12c
作者oracle12c·2013-07-29 19:58
数据库管理员·**证券

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

字数 690阅读 4864评论 0赞 0
 
 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))
 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广