Sql 圆函数与算术溢出
在MS SQL Server中,如果Sql 圆函数与算术溢出,sql,sql-server,rounding,Sql,Sql Server,Rounding,在MS SQL Server中,如果 SELECT ROUND(9.4, 0), ROUND(8.6, 0), ROUND(10.6, 0) 我毫不奇怪地得到: 9.0 9.0 11.0 但如果我这样做了 SELECT ROUND(9.6, 0) 我得到: Msg 8115,16级,状态2,第1行 将表达式转换为数据类型numeric时出现算术溢出错误 我知道我可以将9.6转换为十进制(10,0)),但这里发生了什么 TIASQL将第一个参数作为数据类型,在本例中为十进制(2,1)。预期结
SELECT ROUND(9.4, 0), ROUND(8.6, 0), ROUND(10.6, 0)
我毫不奇怪地得到:
9.0 9.0 11.0
但如果我这样做了
SELECT ROUND(9.6, 0)
我得到:
Msg 8115,16级,状态2,第1行
将表达式转换为数据类型numeric时出现算术溢出错误
我知道我可以将9.6转换为十进制(10,0)),但这里发生了什么
TIASQL将第一个参数作为数据类型,在本例中为
十进制(2,1)
。预期结果10.0应该是DECIMAL(3,1)
类型,这就是您得到错误的原因
尝试:
然后尝试:
SELECT ROUND(cast(9.6 as decimal(3,1)), 0)
SQL将第一个参数作为数据类型,在本例中为
DECIMAL(2,1)
。预期结果10.0应该是DECIMAL(3,1)
类型,这就是您得到错误的原因
尝试:
然后尝试:
SELECT ROUND(cast(9.6 as decimal(3,1)), 0)
当你从9.6取整时,它需要一个额外的数字来存储数字。对于文字十进制值,在执行舍入操作之前,必须转换为更宽的值。您可能希望将其视为浮点值。如果您尝试
round(9.6e,0)
您将看到不同的行为
使用
sql\u variant\u属性
查看更多详细信息。显然天花()
和floor()
没有相同的问题(可能是因为它们只输出整数和零小数?)。这两个函数似乎保持相同的精度,但将刻度向上滑动到零,这总是为潜在的新位置留出足够的空间。从9.6取整时,需要额外的数字来存储数字。对于文字十进制值,在执行舍入操作之前,必须转换为更宽的值。您可能希望将其视为浮点值。如果您尝试round(9.6e,0)
您将看到不同的行为
使用
sql\u variant\u属性
查看更多详细信息。显然天花()
和floor()
没有相同的问题(可能是因为它们只输出整数和零小数?)。这两个函数似乎保持相同的精度,但将刻度向上滑动到零,这总是为潜在的新位置留出足够的空间。它从1位舍入到10位,并溢出,因为它现在有太多的有效数字要保留。在四舍五入之前,您需要将文本强制转换为所需的类型。它从1位四舍五入到10位并溢出,因为它现在有太多的有效数字要保留。在舍入之前,您需要将文字强制转换为所需的类型。酷。。。所以selectround(10.6,0)
应该有效,而selectround(9.6)
不会,但是selectround(10.6,0),round(9.6,0)
会有效!暗示10.6的顺序允许9.6,0工作!您将看到selectround(99.6,0)
Cool。。。所以selectround(10.6,0)
应该有效,而selectround(9.6)
不会,但是selectround(10.6,0),round(9.6,0)
会有效!暗示10.6的顺序允许9.6,0工作!您将看到select round(99.6,0)