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));