【问题标题】:Benford's Law Program in Java本福德的 Java 法律课程
【发布时间】:2017-08-12 23:02:40
【问题描述】:

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

【问题讨论】:

    标签: java bigdecimal benfords-law


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • @Jaden Lee 如果解决了您的问题,请接受我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多