Метод 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 по умолчанию для сложных случаев, но этот тестовый пример не удалось.)