该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
这只是一个错误,或者某个地方是否存在允许这种行为的规范,或者规范允许所有这些都失败了,当得到正确的结果时,应该感谢一个人的祝福?(如果它是一个错误,它已被修复?)
(旁白:我正在编写自定义的字符串到双重代码,并且会针对棘手案例推迟Java默认实现,但此测试用例失败.)