【发布时间】:2014-07-06 14:06:39
【问题描述】:
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,修复了吗?)
(顺便说一句:我正在编写自定义 String-to-double 代码,并打算在棘手的情况下推迟到 Java 默认实现,但这个测试用例失败了。)
【问题讨论】:
标签: java parsing double number-formatting