爪哇的本福德法律项目

时间:2017-08-12 23:02:40

标签: java bigdecimal benfords-law

我正在用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

1 个答案:

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