SQL Server中Decimal变量加减运算结果异常问题
解决SQL Server中decimal加减后未回到0的问题
这个问题我之前也碰到过,其实核心就是decimal类型的精度限制在搞鬼!咱们一步步拆解原因,再给你两个靠谱的解决办法:
为啥会出现这个情况?
你定义的变量@test是decimal(18,8),这意味着它最多只能保留8位小数。而你用来加减的0.000001375是9位小数,当SQL Server处理这个运算时:
- 第一次加法:
0.000001375会被隐式转换成decimal(18,8),这一步直接四舍五入成了0.00000138(因为第9位是5,进一位)。 - 第二次减法:用
0.00000138减去0.000001375,运算时SQL Server会临时提升精度得到0.000000005,但赋值回decimal(18,8)变量时,又一次四舍五入,就变成了0.00000001,自然回不到0了。
两个解决办法
方法1:给变量加足够的小数位数
既然0.000001375需要9位小数才能精确存储,那直接把变量的小数位数改成9位就行:
DECLARE @test AS decimal(18,9) = 0 SET @test = @test + 0.000001375 SELECT @test -- 输出:0.000001375 SET @test = @test - 0.000001375 SELECT @test -- 输出:0.000000000(也就是0)
方法2:用临时变量存高精度运算结果
如果必须保留decimal(18,8)的变量类型,那就先用一个更高精度的临时变量完成运算,再赋值回去:
DECLARE @test AS decimal(18,8) = 0 DECLARE @temp AS decimal(18,9) = @test -- 临时变量用9位小数精度 SET @temp = @temp + 0.000001375 SET @temp = @temp - 0.000001375 SET @test = @temp -- 此时赋值回8位小数,结果就是0 SELECT @test -- 输出:0.00000000(即0)
小提醒
decimal是精确数值类型,但它的“精确”是建立在你定义的精度足够的基础上的。如果要处理的数值位数超过了变量的小数位数,就一定会触发四舍五入,导致精度损失。所以做这类精确运算时,先确认好变量的精度能不能装下所有参与运算的值哦!
内容的提问来源于stack exchange,提问作者Rita Chavda
相关产品推荐
相关产品推荐

