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