2017-08-12 74 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。 –