Sql server 无法在SQL Server 2019中将Java Double.MIN_值4.9E-324用作浮点文本

Sql server 无法在SQL Server 2019中将Java Double.MIN_值4.9E-324用作浮点文本,sql-server,jdbc,floating-point,Sql Server,Jdbc,Floating Point,使用SQL Server运行以下JDBC代码: 请尝试PreparedStatement s=connection.prepareStatementselect 4.9E-324?{ s、 SETDOUBLE 1,4.9E-324; try ResultSet rs=s.executeQuery{ 而rs.next{ System.out.printlnrs.getDouble1; System.out.printlnrs.getDouble2; } } } 结果是: 0.0 4.9E-324

使用SQL Server运行以下JDBC代码:

请尝试PreparedStatement s=connection.prepareStatementselect 4.9E-324?{ s、 SETDOUBLE 1,4.9E-324; try ResultSet rs=s.executeQuery{ 而rs.next{ System.out.printlnrs.getDouble1; System.out.printlnrs.getDouble2; } } } 结果是:

0.0
4.9E-324
因此,虽然绑定值被正确地回显,但文本却没有。这怎么解释呢

当使用5E-18的科学表示法或0.0000000000000000005000000000000005的十进制表示法设置时,小于5E-18的任何浮点值向下舍入为0。从SQL Server 2016 13.x开始,这不再是限制

但我使用的是SQL Server 2019

选择@版本 收益率:

Microsoft SQL Server 2019 (RTM-CU8-GDR) (KB4583459) - 15.0.4083.2 (X64) 
Nov  2 2020 18:35:09 
Copyright (C) 2019 Microsoft Corporation
Express Edition (64-bit) on Linux (Ubuntu 18.04.5 LTS) <X64>
以及SQL Server的JDBC驱动程序的最新版本

com.microsoft.sqlserver mssql jdbc 9.2.1.jre8 它还列出了有效浮点值的范围:

-1.79E+308至-2.23E-308、0和2.23E-308至1.79E+308

因此,Java Double.MIN_值超出范围。这项工作:

请尝试PreparedStatement s=connection.PrepareStatement选择2.23E-308?{ s、 SETDOUBLE 1,2.23E-308; try ResultSet rs=s.executeQuery{ 而rs.next{ System.out.printlnrs.getDouble1; System.out.printlnrs.getDouble2; } } } 制作:

2.23E-308
2.23E-308

但是,这并不能解释为什么bind变量会被正确回显。

在Oracle中,这可能有助于解释:从dual中选择dump4.9E-130,16;-Typ=2 Len=3:80,5,5一些解析器处理异常数的能力很差。您可以尝试使用4.941e-324,因为它略高于可表示的最小正值,而不是低于它。