ROUND函数和算术溢出

时间:2015-11-20 20:42:56

标签: 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,Level 16,State 2,Line 1   将表达式转换为数据类型numeric的算术溢出错误。

我知道我可以CAST(9.6 as DECIMAL(10,0)),但这里发生了什么?

TIA

2 个答案:

答案 0 :(得分:5)

SQL将第一个参数作为数据类型,在本例中为DECIMAL(2,1)。预期结果10.0应为DECIMAL(3,1)类型,这就是您收到错误的原因。

尝试:

SELECT ROUND(cast(9.6 as decimal(2,1)), 0)

然后尝试:

SELECT ROUND(cast(9.6 as decimal(3,1)), 0)

答案 1 :(得分:4)

从9.6向上舍入时,需要一个额外的数字来存储数字。对于文字小数值,在进行舍入操作之前,您必须转换为更宽的值。您可能希望将此视为浮点值。如果您尝试search.crawl(sector),您会看到不同的行为。

使用round(9.6e, 0)进行游戏以了解更多详情。显然sql_variant_propertyceiling()没有相同的问题(也许是因为它们只输出整数和零刻度小数?)。看起来这两个函数保持相同的精度,但是将比例缩小到零,这总是为潜在的新位置留下足够的空间。