sql 服务器中轮函数的不同行为
Different behaviors for round function in sql server
Round 函数有两种行为:当值 cours 等于“3.1235”时,round(cours, 3) = 3.123
。虽然,当我们在这一轮公式中将 cours 替换为它的值 (3.1235) 时,round(3.1235, 3) = 3.1240
.
您不应该像这样将浮点数据类型用于特定的小数值,因为它不是为此目的而设计的。需要查看更多代码才能更好地了解您正在尝试做的事情,但如果它 需要 最初是一个浮点数,则可能您可以将 @cours 转换为十进制?
round(cast(@cours as decimal(5,4)), 3)
您的 FLOAT 并不真正包含 3.1235,这只是打印或显示在网格中的内容。 FLOAT 在内部是 3.1234999999999999
,这显然向下舍入为 3.123
。
字面值 3.1235
变成了一个具有足够精度的数字,完全准确,因此它被四舍五入到 3.124
,正如人们所期望的那样。
证明:
SELECT CAST('3.1235' as FLOAT),
CAST( 3.1235 as FLOAT)
-- misleading output: both print 3.1235
SELECT CAST(CAST('3.1235' as FLOAT) as NUMERIC(24,23)),
CAST(CAST( 3.1235 as FLOAT) as NUMERIC(24,23))
-- both print 3.12349999999999990000000
SELECT CAST('3.1235' as NUMERIC(24,23)),
CAST( 3.1235 as NUMERIC(24,23))
-- both print 3.12350000000000000000000
Round 函数有两种行为:当值 cours 等于“3.1235”时,round(cours, 3) = 3.123
。虽然,当我们在这一轮公式中将 cours 替换为它的值 (3.1235) 时,round(3.1235, 3) = 3.1240
.
您不应该像这样将浮点数据类型用于特定的小数值,因为它不是为此目的而设计的。需要查看更多代码才能更好地了解您正在尝试做的事情,但如果它 需要 最初是一个浮点数,则可能您可以将 @cours 转换为十进制?
round(cast(@cours as decimal(5,4)), 3)
您的 FLOAT 并不真正包含 3.1235,这只是打印或显示在网格中的内容。 FLOAT 在内部是 3.1234999999999999
,这显然向下舍入为 3.123
。
字面值 3.1235
变成了一个具有足够精度的数字,完全准确,因此它被四舍五入到 3.124
,正如人们所期望的那样。
证明:
SELECT CAST('3.1235' as FLOAT),
CAST( 3.1235 as FLOAT)
-- misleading output: both print 3.1235
SELECT CAST(CAST('3.1235' as FLOAT) as NUMERIC(24,23)),
CAST(CAST( 3.1235 as FLOAT) as NUMERIC(24,23))
-- both print 3.12349999999999990000000
SELECT CAST('3.1235' as NUMERIC(24,23)),
CAST( 3.1235 as NUMERIC(24,23))
-- both print 3.12350000000000000000000