numeric类型变量运算转numeric(5,2)遇算术溢出错误求助
解决算术溢出错误:numeric类型转换超出范围
这个错误其实很好理解——你算出来的结果远远超出了numeric(5,2)能装下的范围!
先拆解一下问题:
numeric(5,2)的定义是总共有5位数字,其中2位是小数,也就是说整数部分最多只能有3位,它的取值范围是-999.99到999.99。- 咱们来算你示例里的结果:
这个结果的整数部分有5位,完全超出了((436.63*100)/1.2)-100 = (43663 / 1.2) - 100 ≈ 36385.8333 - 100 = 36285.8333numeric(5,2)的上限,所以数据库直接抛出了算术溢出错误。
解决方案
方案1:扩大目标数据类型的容量
如果业务允许,把目标类型改成numeric(7,2)就可以了——它总共有7位数字,小数占2位,整数部分能放5位,刚好容纳你示例里的结果:
DECLARE @DISCOUNT_PRICE numeric(9,2) = '436.63' DECLARE @PRICE numeric(9,2) = '1.2' SELECT CAST((((@DISCOUNT_PRICE*100)/@PRICE) -100 ) AS NUMERIC(7,2))
方案2:添加范围校验(如果必须用numeric(5,2))
如果业务上硬性要求结果是numeric(5,2),那得先判断计算结果是否在合法范围内,避免溢出:
DECLARE @DISCOUNT_PRICE numeric(9,2) = '436.63' DECLARE @PRICE numeric(9,2) = '1.2' DECLARE @raw_result numeric(9,2) = (((@DISCOUNT_PRICE*100)/@PRICE) -100 ) SELECT CASE WHEN @raw_result BETWEEN -999.99 AND 999.99 THEN CAST(@raw_result AS numeric(5,2)) ELSE NULL -- 这里可以换成你需要的默认值,或者抛出自定义错误 END AS CalculatedResult
小提醒
以后处理numeric(p,s)类型的时候,一定要记住:p是总位数(整数+小数),s是小数位数,整数部分最多只能有p-s位。提前预判计算结果的范围,就能避免这类溢出问题啦。
内容的提问来源于stack exchange,提问作者PsyGnosis
相关产品推荐
相关产品推荐

