我正在用Java编写一个程序,看看Benford法律是否真的如此。我正在使用BigDecimal,但自从我实现它以来就出现了错误。
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
答案 0 :(得分:1)
由于以下行,您的程序会引发异常:
BigDecimal number = BigDecimal.valueOf(Math.pow(2,n));
变量n
在每次迭代时递增1到9999.由于Math.pow(2,n)
变得如此之大,以至于它超过了 double的最大值强>类型。最终Double.toString
(由BigDecimal.valueOf使用)返回&#34; Infinity&#34;是什么导致 NumberFormatException 。
请用以下内容替换上述行以解决问题:
BigDecimal number = BigDecimal.valueOf(2).pow(n));