SQL舍入/截断

时间:2015-08-28 17:38:57

标签: sql sql-server sql-server-2008-r2

SQL ROUND函数似乎有些不对劲。 我需要在第二个小数位截断一些数字。使用此处描述的ROUND函数非常简单:

https://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

我没有做过广泛的测试。但是我在SQL Server 2008 R2和2012上尝试了这个。它似乎对我尝试过的几乎所有数字都很有效,除了2.8它总是返回2.79。 2.9返回2.9,2.4返回2.4。但2.8关闭了。这是我使用REAL的时候 如果我将数据类型更改为FLOAT,则2.4返回2.39,2.9返回2.89。 我不知道为什么。我错过了什么?

请参阅下面的示例代码 穿上石棉内衣,因为我确信我错过了一些明显的东西

DECLARE @x AS REAL

SELECT @x = 2.8

SELECT ROUND(@x,2,1) -- 2.79 WHAT?

SELECT @x = 2.8145

SELECT ROUND(@x,2,1) -- 2.81 OK

SELECT @x = 2.4

SELECT ROUND(@x,2,1) -- 2.4 OK

SELECT @x = 2.9

SELECT ROUND(@x,2,1) -- 2.9 OK

SELECT @x = 2.23954

SELECT ROUND(@x,2,1) -- 2.23 OK

1 个答案:

答案 0 :(得分:1)

DECLARE @x AS REAL, @y AS DECIMAL(10,2)

SELECT @x = 2.8 ,  @y = 2.8

SELECT ROUND(@x,2,1) [Real] , ROUND(@y,2,1) [Decimal]

结果:

Real    Decimal
2.79    2.80

原因是变量的初始数据类型,Real或Float被认为是近似数据类型,通常用于存储虚数,如地球质量,水星距离等。

当使用Float或Real数据类型(近似数据类型)时,sql server看到2.8和2.79几乎/大致相同的值因此差异。

如果使用Numeric或Decimal等确切数据类型,则还会考虑精度,因此会产生预期结果。