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
我在 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