Метод 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
Является ли это просто ошибкой или есть спецификация где-то, что допускает такое поведение, или все это разрешено с помощью спецификации, и нужно просто благодарить одно благословение, когда вы получаете правильный результат? (Если это ошибка, исправлена ли она?)
(Помимо этого: я писал собственный код String-to-double и собирался отложить выполнение Java по умолчанию для сложных случаев, но этот тестовый пример не удалось.)