потеря точности преобразование из java BigDecimal в 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 сохранить их дополнительные места для уточнения?

Спасибо!


Обновление после просмотра этого сообщения. Некоторые люди упоминают, что это превышает точность типа данных double. Если я не http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 тогда двойной примитив имеет максимальное экспоненциальное значение E max = 2 K-1 -1, а стандартная реализация имеет K = 11. Итак, максимальный показатель должен быть 511, нет?

12
задан WhiteFang34 27 April 2011 в 08:08
поделиться