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
答案 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等确切数据类型,则还会考虑精度,因此会产生预期结果。