SQL 服务器 - 使用变量与仅使用值时出现奇怪的循环行为

SQL Server - Strange round behaviour when using variable vs just value

我在 SQL 服务器中遇到这个奇怪的问题,当划分存储在变量中的浮点数时与仅使用该值时。

案例如下:

DECLARE @FLOAT FLOAT = 6.80
print ROUND(@FLOAT / 2, 2, 0);  
print ROUND(@FLOAT / 2, 2, 1);  

它打印:

3.4
3.39

截断值的第二个 ROUND 给出了错误的值。它应该是 3.4 而不是 3.39。

但是当我使用没有变量的值时它工作正常:

print ROUND(6.80 / 2, 2, 0);  
print ROUND(6.80 / 2, 2, 1);  

它打印:

3.400000
3.400000

任何人都可以帮助我理解这个问题吗? 提前致谢。

此行为是预期的。在第一个表达式中,您使用 float,而在后一个文字中使用 decimal。这两种数据类型非常不同。前者是 2 进制值,后者是 10 进制值。

6.80 不能使用Base 2精确存储,所以实际值更接近6.79999999999999982236431605997495353221893310546875。如您所见,略小于 6.8,因此当您将该数字除以2时,您得到的数字略小于2 3.40,可能 3.399999999999999911182158029987476766109466552734375

因此 ROUND 正确地四舍五入了数字,因为上面的值四舍五入到 2 位数 is 3.39 不是 3.40.

对于文字,6.80 是准确表示的,6.80 / 2 (3.40) 也是如此,所以当您将该数字再次四舍五入到小数点后两位时,您仍然会得到 3.40