簡體   English   中英

Java運行時錯誤“非終止十進制擴展; 沒有精確可表示的十進制結果“在BigDecimal類中

[英]Java run-time error “ Non-terminating decimal expansion; no exact representable decimal result” in BigDecimal class

當選擇“積極的不正確的集成”或“負的不正確的集成”時,它給出了一個錯誤,錯誤是線程“main”中的異常java.lang.ArithmeticException:非終止的十進制擴展; 沒有確切的可表示的小數結果。

 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)

碼:

 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"))));

}
}

您可能需要使用指定舍入模式的除法之一。

另請閱讀此處

當您在BigDecimal上執行1/3並且未指定結果的精確度以及圓形方法應該是什么時,會發生這種情況。
請參閱javadoc( http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html
您可以使用MathContext對象將precision和roundupMethod結合在一起。 您也可以選擇直接指定它。 將該信息添加到構造函數或調用divide時都可以。

如果結果數字具有無限的十進制擴展,則Divide方法拋出此異常。 在這種情況下,您需要提供MathContext,它將定義數字的舍入方式,以便它具有有限值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM