Java 中的本福德定律计划
Benford's Law Program in Java
我正在 Java 中编写一个程序来查看本福德定律是否真的成立。我正在使用 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);
}
}
如果你运行这个程序,有错误。
错误在下面的 link 中。
https://pastebin.com/ShJmGjdJ
您的程序由于以下行而抛出异常:
BigDecimal number = BigDecimal.valueOf(Math.pow(2,n));
变量 n
在每次迭代时递增 1,直到 9999。因此 Math.pow(2,n)
变得如此之大,以至于在某些时候它超过了 [=22= 的最大值]double类型。最终 Double.toString
(被 BigDecimal.valueOf 使用) returns "Infinity" 是什么导致了 NumberFormatException.
请将上述行替换为以下内容以解决您的问题:
BigDecimal number = BigDecimal.valueOf(2).pow(n));
我正在 Java 中编写一个程序来查看本福德定律是否真的成立。我正在使用 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);
}
}
如果你运行这个程序,有错误。 错误在下面的 link 中。 https://pastebin.com/ShJmGjdJ
您的程序由于以下行而抛出异常:
BigDecimal number = BigDecimal.valueOf(Math.pow(2,n));
变量 n
在每次迭代时递增 1,直到 9999。因此 Math.pow(2,n)
变得如此之大,以至于在某些时候它超过了 [=22= 的最大值]double类型。最终 Double.toString
(被 BigDecimal.valueOf 使用) returns "Infinity" 是什么导致了 NumberFormatException.
请将上述行替换为以下内容以解决您的问题:
BigDecimal number = BigDecimal.valueOf(2).pow(n));