2011-01-13 6 views
6

Daje mi błąd podczas wybierania "Pozytywnej niewłaściwej integracji" lub "Negatywnej niewłaściwej integracji" Błąd jest Wyjątkiem w wątku " main "java.lang.ArithmeticException: nie kończące się rozszerzenie dziesiętne; brak dokładnego reprezentatywnego wyniku dziesiętnego.Błąd wykonania Java "Niekończąca się ekspansja dziesiętna bez dokładnego reprezentacyjnego wyniku dziesiętnego" w klasie 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) 

Kod:

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

To bardzo skomplikowany kod czegoś, co mogłoby być łatwiejsze do pokazania. Dbasz o to, aby dać prostszy przykład ... i faktyczne * pytanie *, aby z nim poradzić? –

Odpowiedz

11

Prawdopodobnie trzeba zastosować jedną z metod, które określają divide tryb zaokrąglania.

Przeczytaj również here.

+1

Tak, zostałem ukąszony przez tego wcześniej. – time4tea

-1

Metoda dzielenia zgłasza ten wyjątek, jeśli wynikowy numer ma nieskończoną liczbę dziesiętną. W tym przypadku musisz podać MathContext, który określi, w jaki sposób liczba zostanie zaokrąglona, ​​tak aby miała skończoną wartość.

3

Dzieje się tak, gdy robisz 1/3 na BigDecimal i nie określasz, jak dokładny powinien być wynik i jaka powinna być metoda rundy.
Zobacz javadoc (http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html)
Możesz użyć obiektu MathContext, aby łączyć precyzję i roundupMethod razem. Możesz również określić ją bezpośrednio. Dodaj te informacje do konstruktora lub gdy wywoływanie dzielenia jest w porządku.

Powiązane problemy