在 SQL Server 2008 中舍入时,我看到一些奇怪的行为。给出以下代码:
DECLARE @Value REAL
SELECT @Value = .35
SELECT ROUND(@Value, 1)
我预计该值为 0.4,但它输出为 0.3。我必须假设这是因为存储的值实际上小于 0.35,类似于 0.34999999999999。是这样吗,还是我做错了什么?有没有办法确保其行为符合预期,至少从可见值来看?
最佳答案
当您使用 REAL 和 FLOAT(相同)等浮点值时,SQL Server ROUND() 函数遵循 IEEE 标准 754 并使用“向上舍入”算法。
但这对于不同的浮点值意味着不同的事情。一些“.5”值最终存储为“.49999999999”的近似值,其他值存储为“.500000001”等。它对实际存储的值进行四舍五入,而不是您开始时指定的值。
http://msdn.microsoft.com/en-us/library/ms187912.aspx
如果精确的十进制数学对您很重要,请使用 DECIMAL,而不是 FLOAT 或 REAL。
关于sql-server - SQL Server 和 REAL 数据类型的舍入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9526386/