Получение n-ой цифры BigDecimal

Есть ли способ получить n-ую цифру от BigDecimal?

Используя эту статью -> создание пи к n-й цифре Java

Я установил значение числа Пи по формуле Эйлера в BigDecimal. Теперь я хотел бы иметь возможность позвонить на конкретную цифру этого.

int getPiDigit(3) = 4    // 3.14

Я думал, может быть, я мог бы взять BigDecimal и как-то сохранить его значения в массиве. Первоначально я пытался получить значение в виде строки, но когда он преобразуется в строку, он занимает всего около 47 символов. Для моего использования мне нужно по крайней мере перейти к 512.

Вот пример кода, чтобы показать, что я делаю...

MathContext mc = new MathContext(1000);
BigDecimal pi = new BigDecimal(20*Math.atan(1.0/7) + 8*Math.atan(3.0/79) ,mc); //Should give pi up to 1000 digits
System.out.println(pi.toString().charAt(50)); 
//Throws Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 50

3 ответа

Решение

Вы вычисляете пи как двойное число, а затем конвертируете его в BigDecimal. Это волшебным образом не добавит больше точности, чем в двойном, который по определению не может быть больше 53 бит.

Вам нужно сделать вычисление числа пи в BigDecimal.

Самый простой способ - конвертировать BigDecimal к String, и вы можете просто использовать String#charAt(int)

Я не уверен, почему вы не можете получить 47 символов. Преобразование String должно преобразовывать все цифры до масштаба, определенного в вашем BigDecimal. Проблема, скорее всего, вызвана неправильным использованием BigDecimal в вашей логике вычисления Pi


Ваше предположение кажется неверным: передача в MathContext с BigDecimal(double, MathContext) не обязательно делать результат, содержащий значащие цифры, объявленные MathContext. Цитируется из Javadoc:

Переводит double в BigDecimal с округлением в соответствии с настройками контекста. Масштаб BigDecimal - это наименьшее значение, такое что (10^scale × val) является целым числом.

То, как вы делаете, также иррационально: для doubleТочно только для 15 значащих цифр. Взятие 1000 значащих цифр из вашего двойного результата расчета ничего не значит.

Вам нужно вызвать setScale(), чтобы установить желаемое количество десятичных разрядов перед вызовом toString(), например так:

pi.setScale(n, BigDecimal.ROUND_DOWN);

"n" - количество десятичных знаков. Вы хотите округлить, чтобы n-е десятичное число никогда не округлялось.

Другие вопросы по тегам