Преобразование 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