有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

这种Java双重解析行为符合规范吗?

java.lang.Double.parseValue方法以一种不一致的方式处理复杂的双精度表示

如果你写了一个非常大的数字,以至于它超出了double的范围,但又附加了一个大的负指数使其回到范围内,那么你最终会回到范围内(如Scala的REPL所示):

scala>
java.lang.Double.parseDouble("10000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001e-400")
res25: Double = 1.0E-21

另一方面,如果你写了一个非常小的数字,非常小,以至于它超出了double的范围,但随后使用一个大的正指数将其恢复到范围内,那么它只在指数本身不太大时才起作用:

scala> 
java.lang.Double.parseDouble("0.000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000001e400")
res26: Double = Infinity

scala>
java.lang.Double.parseDouble("0.000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000001e200")
res27: Double = 1.0E-179

这仅仅是一个bug,或者某个地方有允许这种行为的规范,或者规范允许所有这些都失败,当得到正确的结果时,应该感谢自己的祝福吗?(如果是bug,是否已修复?)

(旁白:我当时正在编写自定义字符串以实现双重代码,对于复杂的情况,我打算采用Java默认实现,但这个测试用例失败了。)


共 (0) 个答案