1

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

4

1 回答 1

1

由于以下行,您的程序会引发异常:

BigDecimal number = BigDecimal.valueOf(Math.pow(2,n));

该变量n在每次迭代时递增 1,直到 9999。因为它变得如此之大,以至于在某些时候它超过了double类型Math.pow(2,n)的最大值。最终(由BigDecimal.valueOf使用)返回导致NumberFormatException的“Infinity” 。Double.toString

请用以下内容替换上述行以解决您的问题:

BigDecimal number = BigDecimal.valueOf(2).pow(n));
于 2017-08-12T23:47:32.207 回答