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