Недопустимое преобразование строки в двойное для значения Double max - PullRequest
1 голос
/ 14 октября 2019

Я преобразую строковое значение в Double.

Double.MaxValue равно 1.7976931348623157E308

Если я попытаюсь преобразовать значение, большее этого, в Double, я ожидаю преобразованное значениебыть бесконечностью

например

var x = "1.7976931348623158E308".toDouble
println("x: " + x)

Я ожидал увидеть следующее:

x: Inifinity

Вместо этого я получаю

x: 1.7976931348623157E308

т.е. преобразуется в MaxValue (1.7976931348623157E308)

Версия Scala: 2.12.8

Кто-нибудь видел такое поведение? Ожидается ли это?

Спасибо,

Эоин.

1 Ответ

0 голосов
/ 18 октября 2019

Да, это ожидаемое поведение. Синтаксический анализ значения double из представления десятичной строки имеет операцию округления .

Таким образом, все эти строки анализируются с одинаковым значением double:

scala> java.lang.Double.doubleToRawLongBits("1.7976931348623158079372E308".toDouble).toBinaryString
res0: String = 111111111101111111111111111111111111111111111111111111111111111

scala> java.lang.Double.doubleToRawLongBits("1.7976931348623158E308".toDouble).toBinaryString
res1: String = 111111111101111111111111111111111111111111111111111111111111111

scala> java.lang.Double.doubleToRawLongBits("1.7976931348623157123641238313346568234E308".toDouble).toBinaryString
res2: String = 111111111101111111111111111111111111111111111111111111111111111

scala> java.lang.Double.doubleToRawLongBits("1.7976931348623157E308".toDouble).toBinaryString
res3: String = 111111111101111111111111111111111111111111111111111111111111111

scala> java.lang.Double.doubleToRawLongBits("1.79769313486231567E308".toDouble).toBinaryString
res4: String = 111111111101111111111111111111111111111111111111111111111111111
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...