小编Bra*_*rad的帖子

为什么 SQL Server 允许超出 Microsoft 指定范围的 float(53) 值?

我有一个特定的表,列数据类型为 float(53),非空。根据Microsoft 文档,可以存储在此数据类型中的 0 以上的最小值是 2.23E-308。但是,我能够存储一个小得多的值,小到 4.94065645841247E-324。请参阅下图,证明 SQL Server 可以存储和检索文档中指定范围之外的值:

查询显示非常小的浮点数

当我运行如下查询时:

select 4.7E-309
Run Code Online (Sandbox Code Playgroud)

SQL Server 说: Warning: the floating point value '4.7E-309' is too small. It will be interpreted as 0.

截图中插入的值是通过 C++ ADO 接口使用记录绑定插入的。

我有几个问题:

为什么 SQL Server 处理文档中指定范围之外的值?同样,当查询中存在“超出范围”值时,为什么 SQL Server 会发出警告,而数据库显然可以存储超出该范围的值?

浮点数是如何存储在 SQL 数据库表上的,是否有任何 SQL 服务器设置会严格执行一个 SQL 服务器而不是另一个 SQL 服务器上的范围?

我正在尝试解决 ADO 记录绑定(可能)由于值超出范围而被拒绝的问题,但是我所有重现该问题的测试(在不同的 SQL 服务器实例上)表明 SQL 接受的值远远超出文档中指定的限制。任何有关如何在 SQL 中存储和处理浮点的信息(特别是与 .NET 或 C++ 之类的东西有关)将不胜感激。

我已经使用 SQL Server 2005 和 2008 对此进行了测试,结果相同。

sql-server-2005 sql-server-2008 sql-server floating-point

6
推荐指数
1
解决办法
2267
查看次数