我的Fibonacci计算器工作正常,但是当达到更高的数字时,结果会显示为负数,如果它超过其最大值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
答案 0 :(得分:3)
我认为你高于可以存储在Java用于long类型的有符号64位整数中的最大long值,有关Long和Java API的更多信息:http://docs.oracle.com/javase/7/docs/api/java/lang/Long.html。
64位有符号整数的最大正值是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。
答案 1 :(得分:0)
java有8 primitive data types
正如您所看到的,上述类型都不能存储您的值,因此您必须使用BigInteger(example)或任何其他可以处理此大值的类。
答案 2 :(得分:0)
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));
}
}
因为,java中long的最大值是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;