You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server中Decimal变量加减运算结果异常问题

解决SQL Server中decimal加减后未回到0的问题

这个问题我之前也碰到过,其实核心就是decimal类型的精度限制在搞鬼!咱们一步步拆解原因,再给你两个靠谱的解决办法:

为啥会出现这个情况?

你定义的变量@test是decimal(18,8),这意味着它最多只能保留8位小数。而你用来加减的0.000001375是9位小数,当SQL Server处理这个运算时:

  1. 第一次加法:0.000001375会被隐式转换成decimal(18,8),这一步直接四舍五入成了0.00000138(因为第9位是5,进一位)。
  2. 第二次减法:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:32:49