提问人:Itération 122442 提问时间:4/6/2020 最后编辑:marc_sItération 122442 更新时间:4/6/2020 访问量:185
对 SQL Server 浮点数和 SQLCMD 返回的误解
Misunderstanding about SQL Server floats and the return of SQLCMD
问:
根据文档,SQL Server 中的 double 是具有(8 字节存储,15 位精度)的浮点数。n = 53
但是,当我运行从数据库中获取一行时,结果不会返回 15 位精度的双精度/浮点数,而是返回 17 位数字。SQLCMD
例如:0.58974358999999998
小数点的长度是 17 位,为什么不是文档中指定的 15 位?
编辑:这是我的SQL查询:
SELECT TOP(1) *
FROM TABLE
WHERE object_key = '28499'
答:
2赞
Piotr Palka
4/6/2020
#1
您看到的数字已四舍五入。
在后台,SQL Server 不会将浮点数存储为十进制数字。因为您的号码介于两者之间,因此将按以下方式存储:0.5
1
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
求和数、实数和浮点数绝不会存储为精确数字。相反,它们始终是二进制除法的四舍五入的结果。您可以在维基百科上找到有关内部存储的更多信息:
评论