2016-04-20 7 views
2

Я пытаюсь сделать программу для приближения е суммированием следующий номер серии:Расчет количества Eulers с помощью BigDecimal

е = 1 + (! 1/1) + (! 1/2) + (1/! 3) .... + (1/я)

в настоящее время мой код выглядит следующим образом:

public static void main(String[] args) { 

     BigDecimal one = new BigDecimal(1); 
     BigDecimal e = new BigDecimal(1.0); 
     BigDecimal divisor = new BigDecimal(1.0); 

     for (int i = 1; i <= 12; i++) { 

      divisor = divisor.multiply(new BigDecimal(i)); 
      e = e.add(one.divide(divisor)); 

      System.out.println("e = " + e); 

     } 
    } 

программа выполняет расчет (1/п) при п успешно < = 2 , но как только n> = 3, я получаю сообщение об ошибке. Похоже, что программа не может обрабатывать делитель больше, чем 2. Выход программы:

е = 2

е = 2,5

Исключение в потоке «основной» java.lang .ArithmeticException: Неограничивающее десятичное расширение; нет точного представимого десятичного результата. в java.math.BigDecimal.divide (Unknown Source) в ch10.Chapter_10_E20_ApproximateE.main (Chapter_10_E20_ApproximateE.java:16)

Как следует использовать класс BigDecimal преформ суммирование при е = 1 + (1/1 !) + (1/2!) + (1/3!) .... + (1/i!)?

ответ

3

Как мы все знаем, деление на 3 дает число с десятичным представлением, которое продолжается навсегда.

0.5/3 = 0.166666666666666666666666666666666666666666666666666666666666666666.... 

Это подобно тому, что происходит с разделением внутри в BigDecimal, за исключением того, что int с в двоичной форме в настоящее время рассчитывается.

Вам понадобится different overload of divide, который использует масштаб (число десятичных цифр за десятичной точкой) и режим округления. Это сообщает BigDecimal, сколько цифр использовать и как раунд, когда он останавливается.

e = e.add(one.divide(divisor, 20, RoundingMode.HALF_EVEN)); 

Окончательная оценка e выводимый:

e = 2.71828182828616856395 
+0

Фактически, деление обычно принимает точность (общее количество представленных цифр). –

1

Причина этой ошибки в том, что BigDecimal пытается вычислить значение точно, и это не может сделать, потому что 1/3 повторы навсегда в основании 10.

Чтобы исправить это, вам необходимо определить точность и режим округления. Например:

e = e.add(one.divide(divisor, 20, RoundingMode.HALF_UP));