提问人:Chris 提问时间:12/3/2020 更新时间:12/3/2020 访问量:782
将 SQL Server 列从实数转换为浮点数,而不会引入小错误
Cast SQL Server column from real to float without introducing small errors
问:
我正在使用一个SQL Server数据库,我需要将数据从类型为该类型的列中获取到另一个表中的另一列中。根据我的理解,本质上只是精度较低的浮点数 (24),相比之下,默认情况下精度为 53。因此,当从实数转换为浮点数时,我希望实际上获得更高的精度,或者至少不会丢失源值的精度。但是,在执行此操作时,实际上似乎会丢失一些精度:real
float
real
float
为什么会发生这种情况,有没有办法在执行此操作时至少保持源值的精度?
答:
1赞
David Browne - Microsoft
12/3/2020
#1
我很困惑为什么SSMS在显示实际值时会舍入它们,但对浮点值却不做同样的事情
最接近 2.1 的单精度浮点数 () 类似于 2.0999999。因此,将其显示为 2.1 是有意义的。real
最接近 2.1 的双精度浮点数 () 距离
2.099999990000000,这大约是将 2.0999999 从 转换为 时得到的大致结果。float
real
float
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
评论
float
real
ALTER
CONSTRAINTS
INDEX
DROP
ALTER
ALTER
float
仍然是一个不精确的数据类型。两者都是。real
float