不能在SQL Server 2019中使用Java Double.MIN_VALUE 4.9E-324作为浮点文本



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

try (PreparedStatement s = connection.prepareStatement("select 4.9E-324, ?")) {
s.setDouble(1, 4.9E-324);
try (ResultSet rs = s.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getDouble(1));
System.out.println(rs.getDouble(2));
}
}
}

结果是:

0.0
4.9E-324

因此,虽然绑定值被正确地回显,但文字却不是。这怎么解释呢?我在文件中注意到了。

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

但我使用的是SQL Server 2019

select @@version

收益率:

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驱动程序

<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.2.1.jre8</version>
</dependency>

同一文档页面还列出了有效浮点值的范围:

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

因此,JavaDouble.MIN_VALUE超出范围。这项工作:

try (PreparedStatement s = connection.prepareStatement("select 2.23E-308, ?")) {
s.setDouble(1, 2.23E-308);
try (ResultSet rs = s.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getDouble(1));
System.out.println(rs.getDouble(2));
}
}
}

生产:

2.23E-308
2.23E-308

不过,它并没有解释为什么绑定变量会被正确地回显。