2017-08-12 99 views
1

我正在用Java編寫一個程序來查看Benford法則是否真的如此。我使用的是BigDecimal,但是自從我實現它之後就出現了一個錯誤。Benford的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在每次迭代增量高達9999正因爲如此Math.pow(2,n)正變得如此之大,這在某些時候它超出了最大值double類型。最終Double.toString(使用BigDecimal.valueOf)返回「Infinity」,導致NumberFormatException

請以下解決您的問題更換提到行:

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

謝謝您的回答。 –

+0

@Jaden Lee如果問題解決了,請接受我的回答。 –

+0

我接受了你的答案。 @Jakub Ch。 –