带有BigDecimal java的java.lang.NumberFormatException

时间:2018-04-20 12:50:16

标签: java math bigdecimal

我不是一个非常有经验的程序员,请原谅这个问题:D 我实现了这个简短的代码来计算第(n)个斐波纳契数,但是当我变大时,我的BigDecimal似乎不再起作用了。我得到以下错误:

Exception in thread "main" java.lang.NumberFormatException
  at java.math.BigDecimal.<init>(BigDecimal.java:494)
    at java.math.BigDecimal.<init>(BigDecimal.java:383)
    at java.math.BigDecimal.<init>(BigDecimal.java:806)
    at java.math.BigDecimal.valueOf(BigDecimal.java:1274)
    at Fibonacci.next2(Fibonacci.java:42)
    at FibonacciPrint.main(FibonacciPrint.java:23)

这是我的代码:

int index;

public Fibonacci(int index){
    this.index=index;
}

public  BigDecimal next2(){
    System.out.print(index + " ");

    return BigDecimal.valueOf(((Math.pow(1 + Math.sqrt(5), index)- 
                                Math.pow(1-Math.sqrt(5),index))
                                /(Math.pow(2,index)* Math.sqrt(5))));

}

和印刷类:

Fibonacci f2 = new Fibonacci(Integer.parseInt(args[0]));

long startTime2 = System.currentTimeMillis();

line23:

    System.out.println(f2.next2());
    long endTime2 = System.currentTimeMillis();
    System.out.println("Total execution time: " + (endTime2-startTime2) + "ms");

任何人都知道如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

BigDecimal是无限制的,但是您启动它的双重值:

((Math.pow(1 + Math.sqrt(5), index) -
                Math.pow(1 - Math.sqrt(5), index))
                / (Math.pow(2, index) * Math.sqrt(5)));

可能是NaN,导致此异常。

您可以使用BigDecimal.pow代替Math.pow

答案 1 :(得分:0)

检查args[0]的值是多少,如果它不是整数或为空或为空,则程序可能导致NumberFormatException

<强>更新 当数字很大时,> 500可能是计​​算后的NaN(非数字),BigDecimal不支持。请参阅以下问题来处理NaN。 Java: BigDecimal and Double.NaN

答案 2 :(得分:0)

如果您提取用于初始化BigDecimal的值,那么当NaN足够大(比如500)时,您会发现值为input,如下所示:

class Fibonacci {
    int index;

    public Fibonacci(int index) {
        this.index = index;
    }

    public BigDecimal next2() {
        System.out.print(index + " ");

        double v = (Math.pow(1 + Math.sqrt(5), index) - Math.pow(1 - Math.sqrt(5), index)) / (Math.pow(2, index) * Math.sqrt(5));

        System.out.println(v); // <---- Here

        return BigDecimal.valueOf(v);
    }
}

要解决此问题,BigDecimal中还有4项基本操作:plussubtractmultiplydivide,甚至{{1} },所以使用以下代码可以解决这个问题:

pow