В классе BigDecimalесть несколько полезных методов, гарантирующих конвертацию без потерь:
byteValueExact()shortValueExact()intValueExact()longValueExact()
Однако методов floatValueExact()и doubleValueExact()не существует.
Я прочитал исходный код OpenJDK для методов floatValue()и doubleValue(). Оба, кажется, отступают Float.parseFloat()и Double.parseDouble(), соответственно, могут возвращать положительную или отрицательную бесконечность. Например, разбор строки 10000 9s вернет положительную бесконечность. Как я понимаю, BigDecimalнет внутренней концепции бесконечности. Кроме того, анализ строки 100 9 с, как doubleдает 1.0E100, который не является бесконечностью, но теряет точность.
Что такое разумная реализация floatValueExact()и doubleValueExact()?
Я думал о doubleрешении путем объединения BigDecimal.doubleValue(), BigDecial.toString(), Double.parseDouble(String)и Double.toString(double), но это выглядит неаккуратно. Я хочу спросить здесь, потому что может (должно быть!) Быть более простое решение.
Чтобы было ясно, мне не нужно высокопроизводительное решение.