对 SQL Server 浮点数和 SQLCMD 返回的误解

Misunderstanding about SQL Server floats and the return of SQLCMD

提问人:Itération 122442 提问时间:4/6/2020 最后编辑:marc_sItération 122442 更新时间:4/6/2020 访问量:185

问:

根据文档,SQL Server 中的 double 是具有(8 字节存储,15 位精度)的浮点数。n = 53

但是,当我运行从数据库中获取一行时,结果不会返回 15 位精度的双精度/浮点数,而是返回 17 位数字。SQLCMD

例如:0.58974358999999998

小数点的长度是 17 位,为什么不是文档中指定的 15 位?

编辑:这是我的SQL查询:

SELECT TOP(1) * 
FROM TABLE 
WHERE object_key = '28499'
SQL Server 精度 sqlcmd

评论

0赞 Thom A 4/6/2020
您实际上在这里运行什么 SQL 来获得结果?
0赞 Itération 122442 4/6/2020
@Larnu 添加到问题中。
0赞 Thom A 4/6/2020
...我们实际上无法运行该 SQL,因此它不会告诉我们任何事情。
0赞 Itération 122442 4/6/2020
未指定您想要实际数据的事实。因此,我认为您需要我的查询,因为我可能犯了错误/导致所描述的问题。我不能给你数据,因为它来自公司数据库。一旦我有时间(大约3个小时),我就会为您提供样品@Larnu
0赞 Attie Wagner 4/6/2020
您使用的是哪个版本的 SQL?

答:

2赞 Piotr Palka 4/6/2020 #1

您看到的数字已四舍五入

在后台,SQL Server 不会将浮点数存储为十进制数字。因为您的号码介于两者之间,因此将按以下方式存储:0.51

2^(-1) * (1 + 0 * 1/2 + 0*1/4 + ..... + [0 or 1] * 1/(2^52) )  

重要的是,您的数字的精度将存储为切片,例如 ,即: 。然后它将被舍入。SQL Server、SSMS 和 SQLCMD 可以自由决定在显示或转换时如何舍入此数字。例如,他们在版本 2016 中更改了转换期间如何四舍五入为十进制的规则。1/(2^53)1.1102230246251565404236316680908e-16

求和数、实数和浮点数绝不会存储为精确数字。相反,它们始终是二进制除法的四舍五入的结果。您可以在维基百科上找到有关内部存储的更多信息:

双precision_floating point_format