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

为何SQL Server 2008 R2执行ROUND(0.99535,2)会抛出算术溢出错误?

为什么SELECT ROUND(0.99535, 2)在SQL Server 2008 R2中会溢出?

这问题其实是SQL Server对decimal类型的精度规则和ROUND函数的返回特性共同导致的,我给你拆解清楚:

  • 首先,当你直接写0.99535这个字面量时,SQL Server会自动把它解析为decimal(5,5)类型。这里的decimal(p,s)里,p是总位数(整数+小数部分的数字个数),s是小数位数。所以decimal(5,5)意味着:整数部分只能是0(因为p-s=0,没有多余位数留给整数位),小数部分固定5位。

  • 然后看ROUND(0.99535, 2)的逻辑:保留两位小数,第三位是5,会向前进位——0.99 + 0.01 = 1.00。但关键问题是:ROUND函数返回的类型和输入完全一致,也就是还是decimal(5,5)。可1.00要表示为decimal(5,5)的话,得写成1.00000,这时候整数部分的1要占1位,加上5位小数,总位数变成了6位,超过了decimal(5,5)的总位数限制(p=5),自然就触发算术溢出错误了。

解决办法

你可以通过显式指定输入值的精度来避免这个问题,让整数位有足够空间容纳进位后的结果:

-- 方法1:显式转换输入为更高精度的decimal类型
SELECT ROUND(CAST(0.99535 AS DECIMAL(6,5)), 2)

-- 方法2:转换为float类型,绕开decimal的精度限制
SELECT ROUND(0.99535e0, 2)

-- 方法3:如果只需要字符串形式的结果,用STR函数更简单
SELECT STR(0.99535, 4, 2)

这些方法都能让你得到正确的1.00结果,不会触发溢出。

内容的提问来源于stack exchange,提问作者Fran

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:33:06