为何T-SQL对99.9执行ROUND函数时抛出算术溢出错误?
SQL Server中ROUND(99.9, 0)触发算术溢出错误的原因
这个错误的本质是SQL Server的ROUND函数会严格保留原数值的精度和小数位数,具体细节如下:
- 直接输入的
99.9会被SQL Server默认识别为numeric(3,1)类型:总精度(p)为3,小数位数(s)为1,也就是说该类型最多能容纳2位整数+1位小数的数值(比如99.9、98.1这类)。 - 执行
ROUND(99.9, 0)时,计算结果为100,这个值需要以3位整数的形式存储。但ROUND函数会尝试将结果转换回原类型numeric(3,1),此时100需要被表示为100.0,这个值的总位数(3个整数位+1个小数位)是4,超过了原类型总精度3的限制,因此触发「算术溢出错误」。 - 其他数值不会触发错误的原因:要么是ROUND后的结果没有超出原类型的精度范围(比如
ROUND(99.4, 0)得到99,仍符合numeric(3,1)的存储要求),要么是数值本身的默认类型精度更高(比如199.9默认是numeric(4,1),ROUND后得到200,其整数位3位,未超过numeric(4,1)允许的3位整数位上限)。
内容的提问来源于stack exchange,提问作者MUHAMMAD KASHIF FAIZ
相关产品推荐
相关产品推荐

