Klasa BigDecimalma kilka użytecznych metod gwarantujących bezstratną konwersję:
byteValueExact()shortValueExact()intValueExact()longValueExact()
Jednak metody floatValueExact()i doubleValueExact()nie istnieją.
Czytam kod źródłowy OpenJDK dla metod floatValue()i doubleValue(). Oba wydają się wracać odpowiednio do Float.parseFloat()i Double.parseDouble(), co może zwrócić dodatnią lub ujemną nieskończoność. Na przykład parsowanie ciągu 10 000 cyfr 9 zwróci dodatnią nieskończoność. Jak rozumiem, BigDecimalnie ma wewnętrznej koncepcji nieskończoności. Ponadto parsowanie ciągu 100 9s doubledaje 1.0E100, co nie jest nieskończonością, ale traci precyzję.
Co to jest rozsądne wdrożenie floatValueExact()i doubleValueExact()?
Myślałem o doublerozwiązanie łącząc BigDecimal.doubleValue(), BigDecial.toString(), Double.parseDouble(String)i Double.toString(double), ale wygląda niechlujnie. Chcę zapytać tutaj, ponieważ może (musi!) Być prostsze rozwiązanie.
Żeby było jasne, nie potrzebuję rozwiązania o wysokiej wydajności.