Я работаю с приложением, которое полностью основано на двойниках, и у меня возникают проблемы с одним утилитным методом, который анализирует строку в double. Я нашел исправление, в котором использование BigDecimal для преобразования решает проблему, но возникает другая проблема, когда я перехожу к преобразованию BigDecimal в double: я теряю несколько точек точности. Например:
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class test {
public static void main(String [] args){
String num = "299792.457999999984";
BigDecimal val = new BigDecimal(num);
System.out.println("big decimal: " + val.toString());
DecimalFormat nf = new DecimalFormat("#.0000000000");
System.out.println("double: "+val.doubleValue());
System.out.println("double formatted: "+nf.format(val.doubleValue()));
}
}
Это приводит к следующему выводу:
$ java test
big decimal: 299792.457999999984
double: 299792.458
double formatted: 299792.4580000000
Отформатированный двойник демонстрирует, что он потерял точность после третьего места (для приложения требуются те нижние точки точности).
Как я могу заставить BigDecimal сохранить эти дополнительные места точности?
Спасибо!
Обновление после догоняющего сообщения. Несколько человек упоминают, что это превышает точность двойного типа данных. Если я не прочитал эту ссылку неправильно: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 то двойной примитив имеет максимальное экспоненциальное значение E max= 2 K-1 -1, а стандартная реализация имеет K = 11. Итак, максимальный показатель должен быть 511, no?