2017-08-12 19 views
1

私はベンフォードの法則が実際に真であるかどうかを調べるためにJavaでプログラムを作っています。 BigDecimalを使用していますが、実装して以来エラーが発生しました。ベンフォードの法則プログラム(Java)

import java.lang.*; 
import java.math.BigDecimal; 

public class BenfordLaw { 
    public static int oneornot(BigDecimal number) { 
     String str2num = number.toString(); 
     if(str2num.startsWith("1")) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 
    public static void main(String[] args) { 
     int n = 0; 
     long sum = 0; 
     for (int i = 0; i < 10000; i++) { 
      BigDecimal number = BigDecimal.valueOf(Math.pow(2,n)); 
      System.out.println(number); 
      double newnum = oneornot(number); 
      sum += newnum; 
      n+=1; 
     } 
     System.out.println(sum); 
     System.out.println(sum*0.0001); 
    } 
} 

このプログラムを実行すると、エラーが発生します。 エラーは下のリンクにあります。 https://pastebin.com/ShJmGjdJ

答えて

1

あなたのプログラムが原因で次の行の例外をスロー:

BigDecimal number = BigDecimal.valueOf(Math.pow(2,n)); 

変数n毎に1ずつインクリメントさはそのためMath.pow(2,n)の9999までのイテレーションいくつかの点であること、とても大きくなってきていますdoubleタイプの最大値を超えています。最終的にDouble.toStringBigDecimal.valueOfによって使用される)は、NumberFormatExceptionにつながる "Infinity"を返します。

あなたの問題を解決するには、次のと述べたラインを交換してください:

BigDecimal number = BigDecimal.valueOf(2).pow(n)); 
+0

は、あなたの答えをいただき、ありがとうございます。 –

+0

@Jaden Leeあなたの問題を解決した場合は、私の答えを受け入れてください。 –

+0

私はあなたの答えを受け入れました。 @ Jakub Ch。 –