Проблема:
Вероятно, в этих строках возникает ошибка:
summationPi = firstFactorial.intValue()*firstAddition.intValue();
summationPi /= firstExponent.intValue()*secondExponent.intValue();
Причина в том, что вы звоните intValue()
на BigInteger
, что не гарантируетсявернуть полное значение (поскольку int
может содержать только 32 бита данных. Это также может сыграть с сохранением результата как double
вместо BigDecimal
).
Youзатем возьмите это возможное NaN
значение и используйте его в качестве делителя в вашем делении.
Решение:
BigDecimal currentPi = BigDecimal.ONE;
currentPi = currentPi.add(
new BigDecimal(firstFactorial.multiply(firstAddition))
.divide(new BigDecimal(firstExponent.multiply(secondExponent)), new MathContext(10000)));
Обратите внимание, что я могу устранить summationPi
путем объединения нескольких строк водин.Кроме того, MathContext
, который появляется в методе divide()
, установлен на 10000
, это можно изменить с любой точностью, которую вы хотите.
Для получения дополнительной информации о проверке BigDecimal
, API .