我的斐波那契计算器工作正常,但是当数字上升到更高时,结果会变成负数,就像它超过最大值
Integer
一样。
它正在使用缓存
java.util.Map<Integer, Long>
。 Map
中的所有内容都完全符合预期,但是当打印出来时,我得到例如对于 291:
-784134397488903422
根据http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibCalcX.html,应该是:
2923602405716568564338475449381171413803636207598822186175234
我的
Long
似乎出了点问题,但我还不确定到底是什么。有人可以指出我正确的方向吗?
Map
条目的值:
http://pastebin.com/uje07Ays
我认为您超过了 Java 用于 long 类型的有符号 64 位整数中可以存储的最大 long 值,有关 Long 的更多信息以及 Java API 中的这些信息:http://docs.oracle.com/javase /7/docs/api/java/lang/Long.html。
The maximum positive value for a 64 bits signed integer is 2^63 -1:
9 223 372 036 854 775 807
,你的值似乎已经达到这个限制,如果有符号整数的最高位是1,那么有符号整数变成负数(见2 补整数更多细节:http://en.wikipedia.org/wiki/Two%27s_complement).
您需要使用 BigInteger 来获得任意精度的整数http://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html.
java有8种原始数据类型
如您所见,以上类型都不能存储您的值,因此您必须使用 BigInteger(example)或任何其他可以处理这个大值的类。
public static void main(String[] args)
{
Map<Integer, BigDecimal> fibonacciMap = new HashMap<Integer, BigDecimal>();
fibonacciMap.put(1, BigDecimal.valueOf(1));
fibonacciMap.put(2, BigDecimal.valueOf(1));
System.out.println(1 + " : " + fibonacciMap.get(1));
System.out.println(2 + " : " + fibonacciMap.get(2));
for(int i=3;i<=300;i++)
{
fibonacciMap.put(i, fibonacciMap.get(i-1).add(fibonacciMap.get(i-2)));
System.out.println(i + " : " + fibonacciMap.get(i));
}
}
因为,long 在 java 中的最大值是 9223372036854775807。因此,当斐波那契数超过这个最大值时,它开始从 -9223372036854775808(最小值)到零到 9223372036854775807(最大值)四舍五入。因此,我们需要使用 BigDecimal 而不是 Long 来避免 -ve 值。
例如:
Fib[92]=7540113804746346429
Fib[91]=4660046610375530309
(BigDecimal)Fib[93]=Fib[91]+Fib[92]=12200160415121876738 大于 Long.MAX_VALUE
(长)Fib[93]= -6246583658587674878
Long.MAX_VALUE = 9223372036854775807
Long.MIN_VALUE = -9223372036854775808
所以, (BigDecimal)Fib[93] = Long.MAX_VALUE - (Long.MIN_VALUE - (Long)Fib[93]) + 1;