Bri*_*nga 8 sql-server rounding
在SQL Server 2008中进行舍入时,我看到了一些奇怪的行为.给出以下代码:
DECLARE @Value REAL
SELECT @Value = .35
SELECT ROUND(@Value, 1)
Run Code Online (Sandbox Code Playgroud)
我希望它的值为.4,但它会输出.3.我必须假设这是因为存储的值实际上小于.35,类似于.34999999999999.是这样的,还是我做错了什么?有没有办法确保这种行为符合预期,至少从可见值开始?
将数据存储为REAL太糟糕了,但并非所有希望都丢失了.在舍入之前将REAL转换为DECIMAL(10,2).这样0.3499999999999(或存储的任何不准确的值)将四舍五入为.35,然后你将其舍入为0.4.您甚至可以将结果转换为DECIMAL(10,1),如果您希望它显示为0.4:
DECLARE @Value REAL
SELECT @Value = .35
SELECT CONVERT(DECIMAL(10,1), ROUND(CONVERT(DECIMAL(10,2), @Value), 1))
Run Code Online (Sandbox Code Playgroud)
当您使用REAL和FLOAT等浮点值时(同样的事情),SQL Server ROUND()函数遵循IEEE标准754并使用"向上舍入"算法.
但这对于不同的浮点值意味着不同的东西.一些".5"值最终存储为".49999999999"的近似值,其他值为".500000001"等.它将实际存储的值向上舍入,而不是您开始时给出的值.
http://msdn.microsoft.com/en-us/library/ms187912.aspx
如果精确的十进制数学对您很重要,请使用DECIMAL,而不是FLOAT或REAL.