Преобразование BigDecimal в удвоение

При преобразовании BigDecimal в удвоение добавляются дополнительные точности. Не могли бы вы предложить это. Например:

BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);

И ценность отпечатков - 1.23456789123456992E17, Почему последняя цифра 7 преобразуется в 6992? Есть ли способ получить тот же вход, который я передаю в BigDecimal после преобразования в двойной?

1 ответ

Есть полезные методы Math.nextUp() а также Math.nextDown() который может помочь вам исследовать эту проблему:

BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);
System.out.println(Math.nextDown(value));
System.out.println(Math.nextUp(value));

Выход:

1.23456789123456992E17
1.23456789123456976E17
1.23456789123457008E17

Итак, как вы можете видеть, двойное число ...456976 немедленно сопровождается ...456992 за которым сразу же следует ...457008, Так BigDecimal.doubleValue() следует выбирать между двумя ближайшими номерами ...456992 а также ...457008, Никакого другого двойного числа между ними не существует.

На самом деле вам даже не нужно BigDecimal для этого теста:

double value = 1.23456789123457E+17;
System.out.println(value); // prints 1.23456789123456992E17
Другие вопросы по тегам