Java Longs中的Fibonacci计算显示为负数

时间:2015-03-22 13:53:34

标签: java integer long-integer fibonacci

我的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

3 个答案:

答案 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

字节

  • 最小值为-128(-2 ^ 7)
  • 最大值为127(含)(2 ^ 7 -1)
  • 默认值为0

  • 最小值为-32,768(-2 ^ 15)
  • 最大值为32,767(含)(2 ^ 15 -1)
  • 默认值为0.
  • 短数据类型也可用于将内存保存为字节数据类型。 short是int的2倍(但java将此类型更改为int以进行计算)

INT

  • 最低值为 - 2,147,483,648。( - 2 ^ 31)
  • 最大值为2,147,483,647(含)。(2 ^ 31 -1),超过您的数量
  • Int通常用作整数值的默认数据类型 除非有关于记忆的担忧。
  • 默认值为0.

  • 最低值为-9,223,372,036,854,775,808。( - 2 ^ 63)
  • 最大值为9,223,372,036,854,775,807(含)。 (2 ^ 63 -1)此值小于您的数字
  • 当需要比int更宽的范围时使用此类型。
  • 默认值为0L。

  • 浮点数据类型是单精度32位IEEE 754浮点。
  • Float主要用于在大型浮点数组中保存内存 数字。将此类型用于int值是犯罪
  • 默认值为0.0f。

  • 双数据类型是双精度64位IEEE 754浮点数 点。
  • 此数据类型通常用作十进制的默认数据类型 值,通常是默认选择。
  • 不应将双数据类型用于精确值,例如 货币。
  • 默认值为0.0d。

布尔

  • 布尔数据类型代表一位信息。
  • 只有两个可能的值:true和false。
  • 此数据类型用于跟踪true / false的简单标志 条件。
  • 默认值为false。

  • har数据类型是一个16位Unicode字符。
  • 最小值为'\ u0000'(或0)。
  • 最大值为'\ uffff'(或65,535(含))。
  • 字符数据类型用于存储任何字符。

正如您所看到的,上述类型都不能存储您的值,因此您必须使用BigIntegerexample)或任何其他可以处理此大值的类。

答案 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;