Klasa BigDecimal
ma 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, BigDecimal
nie ma wewnętrznej koncepcji nieskończoności. Ponadto parsowanie ciągu 100 9s double
daje 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 double
rozwią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.