2011-01-13 8 views
6

me da un error al elegir "Integración incorrecta incorrecta" o "Integración incorrecta negativa" el error es Excepción en el hilo " main "java.lang.ArithmeticException: expansión decimal no terminada; sin resultado decimal representable exacto.Error de tiempo de ejecución de Java "Expansión decimal sin terminación; sin resultado decimal representable exacto" en clase BigDecimal

at java.math.BigDecimal.divide(BigDecimal.java:1603) 
at SE_Project_2.calculate(SE_Project_2.java:55) 
at SE_Project_2.main(SE_Project_2.java:45) 

Código:

import java.math.BigDecimal; 
import javax.swing.JOptionPane; 

public class SE_Project_2 { 

    private static BigDecimal C0 = new BigDecimal("0.1713245"); 
    private static BigDecimal C1 = new BigDecimal("0.3607616"); 
    private static BigDecimal C2 = new BigDecimal("0.4679139"); 
    private static BigDecimal C3 = new BigDecimal("0.4679139"); 
    private static BigDecimal C4 = new BigDecimal("0.3607616"); 
    private static BigDecimal C5 = new BigDecimal("0.1713245"); 
    private static BigDecimal X0 = new BigDecimal("-0.932469514"); 
    private static BigDecimal X1 = new BigDecimal("-0.661209386"); 
    private static BigDecimal X2 = new BigDecimal("-0.238619186"); 
    private static BigDecimal X3 = new BigDecimal("0.238619186"); 
    private static BigDecimal X4 = new BigDecimal("0.661209386"); 
    private static BigDecimal X5 = new BigDecimal("0.932469514"); 
    private static BigDecimal a=new BigDecimal("0"),b=new BigDecimal("0"); 
    private static int y; 
    public static void main(String[] args) { 
     Scanner in = new Scanner(System.in); 
     try{ 
      String[] o = {"Positive improper integration","Negative improper integration","Normal integration"}; 
      y = JOptionPane.showOptionDialog(null,"Welcome to my program! \nYahya Al-Buluwi\nIt can work for big decimal numbers.\n\nThis program will find the integral of: \nf(x)= 5x + 3 dx\nBy using the 6-points Gauss Legendre Quadrature formulae.\n\n What choise is prefered to you?","Welcome",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,o,o[2]); 
    BigDecimal sum = null; 


if (y==2){ 
a = new BigDecimal((String)JOptionPane.showInputDialog(null,"Enter the value of a:","Enter the value of a", JOptionPane.QUESTION_MESSAGE)); 
     b = new BigDecimal((String)JOptionPane.showInputDialog(null,"Enter the value of b:","Enter the value of b", JOptionPane.QUESTION_MESSAGE)); 
} 
sum = calculate(X0,C0).add(calculate(X1,C1).add(calculate(X2,C2)).add(calculate(X3,C3).add(calculate(X4,C4).add(calculate(X5,C5))))); 
System.out.println("y=" + y); 
JOptionPane.showMessageDialog(null,"The 6-points Gauss Legendre Quadrature formulae solution according to \na= " + a+"\nb= "+b+" \nis: "+ sum,"Result",JOptionPane.INFORMATION_MESSAGE); 

    }catch(Exception e){ 
     JOptionPane.showMessageDialog(null,"Ooops! an error has occured! the program will be terminated.","Error",JOptionPane.ERROR_MESSAGE); 
     calculate(X0,C0).add(calculate(X1,C1).add(calculate(X2,C2)).add(calculate(X3,C3).add(calculate(X4,C4).add(calculate(X5,C5))))); 
System.out.println("y=" + y); 
JOptionPane.showMessageDialog(null,"The 6-points Gauss Legendre Quadrature formulae solution according to \na= " + a+"\nb= "+b+" \nis: "+ calculate(X0,C0).add(calculate(X1,C1).add(calculate(X2,C2)).add(calculate(X3,C3).add(calculate(X4,C4).add(calculate(X5,C5))))),"Result",JOptionPane.INFORMATION_MESSAGE); 

    } 
} 
public static BigDecimal calculate(BigDecimal x, BigDecimal c){ 
    BigDecimal h = x.multiply(new BigDecimal("0.5")); 
    if(y==0){ 
    //  PI= (1/(.5x)**2)*((5/(.5+.5x))+3) 
    return (((new BigDecimal("1")).divide(h.pow(2))).multiply((new BigDecimal("3")).add((new BigDecimal("5")).divide((new BigDecimal("0.5")).add(h))))); 
    } 
    if(y==1){ 
    //  NI= (1/(-.5x)**2)*((5/(-.5-.5x))+3) 
    return ((new BigDecimal("1").divide((h.negate()).pow(2))).multiply(new BigDecimal("3").add(new BigDecimal("5").divide(new BigDecimal("-0.5").add(h.negate()))))); 
    } 

BigDecimal sum = (b.add(a)).divide(new BigDecimal("2")); 
    BigDecimal diff =(b.add(a.negate())).divide(new BigDecimal("2")); 
    return c.multiply(diff.multiply((((diff.multiply(x)).add(sum)).multiply(new BigDecimal("5"))).add(new BigDecimal("3")))); 

} 
} 
+4

Eso es un código complicado para algo que probablemente podría mostrarse mucho más simple. ¿Te importa proporcionar un ejemplo mucho más simple ... y una * pregunta * real para completarlo? –

Respuesta

11

Es probable que tenga que utilizar uno de los métodos divide que especifican el modo de redondeo.

Lea también here.

+1

Sí, ha sido mordido por este antes. – time4tea

-1

El método de división arroja esta excepción si el número resultante tiene una expansión decimal infinita. En este caso, debe proporcionar un MathContext, que definirá cómo se redondeará el número, de modo que tenga un valor finito.

3

Esto ocurre cuando hace 1/3 en BigDecimal y no especifica qué tan preciso debe ser el resultado y cómo debería ser el método de ronda.
Ver javadoc (http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html)
Puede usar un objeto MathContext para ajustar la precisión y roundupMethod juntos. También puede elegir especificarlo directamente. Agregue esa información al constructor o cuando llame a divide estén ambos bien.

Cuestiones relacionadas