为何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
相关产品推荐
相关产品推荐

