为什么浮点类型会将 .5 四舍五入到 0,我该如何避免它?[复制]

Why does the float type round .5 to 0 and how can I avoid it? [duplicate]

提问人:Sergey Alikin 提问时间:6/21/2023 最后编辑:A-TechSergey Alikin 更新时间:6/22/2023 访问量:78

问:

我有这个声明(SQL Server 2012):

SELECT ROUND(CAST(50.9685 as float), 3) AS Col1 INTO #Test

我希望看到结果“50.969”,但实际上我看到的是“50.968”。 例如,当使用 decimal(10,5) 而不是 float 时,结果将符合预期。

为什么会发生这种情况,我该如何解决这个问题?

SQL-Server 强制 转换舍入

评论

6赞 Thom A 6/21/2023
这就是为什么使用 a 是个坏主意。 因为 a 不是 ,而是 .因此,预期值。float50.9685float50.968550.96849999999999900050.968
0赞 Sergey Alikin 6/21/2023
@ThomA,感谢您的解释。对此的解决方案是什么?我尝试使用十进制,但它应该用小数点的数量进行硬编码,并在 CAST 时给出算术溢出。
0赞 Thom A 6/21/2023
“解决这个问题的办法是什么?”不要使用 ,请使用适合十进制值 (a) 的数据类型。floatdecimal
0赞 Thom A 6/21/2023
SELECT ROUND(50.9685,3)对我来说效果很好。它不会给出错误。
0赞 Panagiotis Kanavos 6/21/2023
gives arithmetical overflow when CAST it.最大值为 10^38。你试着存储了什么?使用与数据匹配的精度和小数位数。如果有什么东西失败了,请检查原因。这很可能是坏数据

答:

1赞 David Browne - Microsoft #1

这就是为什么使用浮点数是个坏主意的原因。50.9685 作为浮点数不是 50.9685,而是 50.968499999999999000。因此,50.968 是预期值。