Клас 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)
, але це виглядає неакуратно. Я хочу запитати тут, бо може (треба!) Бути більш простим рішенням.
Щоб було зрозуміло, мені не потрібно високоефективне рішення.