SQL Server和REAL数据类型的舍入问题

时间:2012-03-02 00:31:13

标签: sql-server rounding

在SQL Server 2008中进行舍入时,我看到了一些奇怪的行为。给出以下代码:

DECLARE @Value REAL
SELECT @Value = .35
SELECT ROUND(@Value, 1)

我希望该值为.4,但输出.3。我必须假设这是因为存储的值实际上小于.35,类似于.34999999999999。是这样的,还是我做错了什么?有没有办法确保这种行为符合预期,至少从可见值开始?

2 个答案:

答案 0 :(得分:8)

将数据存储为REAL太糟糕了,但并非所有希望都丢失了。在舍入之前将REAL转换为DECIMAL(10,2)。这样0.3499999999999(或存储的任何不准确的值)将四舍五入为.35,然后你将其舍入为0.4。如果您希望将结果显示为0.4,您甚至可以将结果转换为DECIMAL(10,1):

DECLARE @Value REAL
SELECT @Value = .35
SELECT CONVERT(DECIMAL(10,1), ROUND(CONVERT(DECIMAL(10,2), @Value), 1))

答案 1 :(得分:8)

当您使用REAL和FLOAT等浮点值时(同样的事情),SQL Server ROUND()函数遵循IEEE标准754并使用“向上舍入”算法。

但这对于不同的浮点值意味着不同的东西。一些“.5”值最终存储为“.49999999999”的近似值,其他值为“.500000001”等。它将实际存储的值向上舍入,而不是您开始时给出的值。

http://msdn.microsoft.com/en-us/library/ms187912.aspx

如果精确的十进制数学对您很重要,请使用DECIMAL,而不是FLOAT或REAL。