我不是一个非常有经验的程序员,请原谅这个问题: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");
任何人都知道如何解决这个问题?
答案 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项基本操作:plus
,subtract
,multiply
,divide
,甚至{{1} },所以使用以下代码可以解决这个问题:
pow