将 SQL Server 列从实数转换为浮点数,而不会引入小错误

Cast SQL Server column from real to float without introducing small errors

提问人:Chris 提问时间:12/3/2020 更新时间:12/3/2020 访问量:782

问:

我正在使用一个SQL Server数据库,我需要将数据从类型为该类型的列中获取到另一个表中的另一列中。根据我的理解,本质上只是精度较低的浮点数 (24),相比之下,默认情况下精度为 53。因此,当从实数转换为浮点数时,我希望实际上获得更高的精度,或者至少不会丢失源值的精度。但是,在执行此操作时,实际上似乎会丢失一些精度:realfloatrealfloat

Conversion real to float

为什么会发生这种情况,有没有办法在执行此操作时至少保持源值的精度?

sql-server 强制转换 浮点 精度

评论

0赞 Thom A 12/3/2020
真正的问题是你为什么要使用,如果你想要精确的值。floatreal
1赞 Thom A 12/3/2020
您可以使用 ;但是,如果列上有 和 es,则需要先创建它们,然后再重新创建它们。此外,如果有任何引用它们的架构绑定对象,也需要删除并重新创建这些对象。ALTERCONSTRAINTSINDEXDROP
1赞 Arvo 12/3/2020
源值不精确 - SSMS 只是以这种方式显示它们。
1赞 Thom A 12/3/2020
“这些更改可以快速完成吗”,从技术上讲,您可以对它们使用动态语句,但它肯定不会考虑会阻止操作的任何其他对象。您真正想要做的是在开发环境中制作迁移脚本,以便您拥有执行所有更改的大批处理;而且由于它是开发,因此您破坏什么并不重要。至于在表中会发生什么,在 DDL 语句完成之前,查询可能会被阻止。ALTERALTER
1赞 Thom A 12/3/2020
float仍然是一个不精确的数据类型。两者都是。realfloat

答:

1赞 David Browne - Microsoft 12/3/2020 #1

我很困惑为什么SSMS在显示实际值时会舍入它们,但对浮点值却不做同样的事情

最接近 2.1 的单精度浮点数 () 类似于 2.0999999。因此,将其显示为 2.1 是有意义的。real

最接近 2.1 的双精度浮点数 () 距离 2.099999990000000,这大约是将 2.0999999 从 转换为 时得到的大致结果。floatrealfloat

SSMS 会将更接近 2.1 的浮点数显示为 2.1,例如

select cast(2.1 as float), cast(2.1 as float) - 0.000000000000001 

显示为

---------------------- ----------------------
2.1                    2.1

这是一篇论文,它回顾了这种转换的算法,并提出了一个新的算法:快速准确地打印浮点数 整数

0赞 Arvo 12/3/2020 #2

正如大卫·布朗(David Browne)的补充一样:

看起来直接铸造对你没有帮助。你可以得到“正确”(更好的)结果,通过字符类型进行转换,如下所示:

select cast(cast(Valuef as nvarchar(20)) as float)

例如,仅显示 .select cast(cast(cast(2.1 as real) as nvarchar(20)) as float)2.1