В классе 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)
, но это выглядит неаккуратно. Я хочу спросить здесь, потому что может (должно быть!) Быть более простое решение.
Чтобы было ясно, мне не нужно высокопроизводительное решение.