Java Longs中的斐波那契计算显示为负数

Java Longs中的斐波那契计算显示为负数,java,integer,long-integer,fibonacci,Java,Integer,Long Integer,Fibonacci,我的斐波那契计算器工作正常,但当计算更大的数字时,结果是负数,就像它是一个大于其最大值的整数一样 它正在使用缓存java.util.Map。进入地图的所有内容都与预期相符,但当打印出来时,我得到了例如291: -784134397488903422 根据《公约》,它应该是: 2923602405716568564338475449381171413803636207598822186175234 我的长的s似乎出了问题,但我还不确定具体是什么。有人能给我指一下正确的方向吗 Map条目的值:

我的斐波那契计算器工作正常,但当计算更大的数字时,结果是负数,就像它是一个大于其最大值的
整数一样

它正在使用缓存
java.util.Map
。进入
地图的所有内容都与预期相符,但当打印出来时,我得到了例如291:

-784134397488903422
根据《公约》,它应该是:

2923602405716568564338475449381171413803636207598822186175234
我的
长的
s似乎出了问题,但我还不确定具体是什么。有人能给我指一下正确的方向吗

Map
条目的值: java有8个

字节
  • 最小值为-128(-2^7)
  • 最大值为127(含)(2^7-1)
  • 默认值为0
短的
  • 最小值为-32768(-2^15)
  • 最大值为32767(含)(2^15-1)
  • 默认值为0
  • 短数据类型也可用于将内存保存为字节数据类型。short比int小2倍(但java将此类型更改为int进行计算)
int
  • 最小值为-2147483648。(-2^31)
  • 最大值为2147483647(含)。(2^31-1),大于您的数字
  • Int通常用作整数值的默认数据类型 除非有关于记忆的问题
  • 默认值为0
长的
  • 最小值为-9223372036854775808。(-2^63)
  • 最大值为9223372036854775807(含)。(2^63-1)此值小于您的数字
  • 当需要比int更宽的范围时,使用此类型
  • 默认值为0L
浮动
  • 浮点数据类型是单精度32位IEEE 754浮点
  • 浮点主要用于在大型浮点数组中节省内存 数字。将此类型用于int值是错误的
  • 默认值为0.0f
双重的
  • 双数据类型是双精度64位IEEE 754浮点型 重点
  • 此数据类型通常用作decimal的默认数据类型 值,通常为默认选择
  • 不应将双精度数据类型用于精确值,例如 货币
  • 默认值为0.0d
布尔值
  • 布尔数据类型表示一位信息
  • 只有两个可能的值:true和false
  • 此数据类型用于跟踪真/假的简单标志 条件
  • 默认值为false
烧焦
  • har数据类型是单个16位Unicode字符
  • 最小值为“\u0000”(或0)
  • 最大值为“\uffff”(或65535(含65535))
  • Char数据类型用于存储任何字符

正如您所见,上述类型中没有一种可以存储您的值,因此您必须使用()或任何其他能够处理如此大的值的类。

我认为您已经超过了Java用于长类型的有符号64位整数中可以存储的最大长值,Java API中有关长和长的更多信息:

64位有符号整数的最大正值为2^63-1:
9 223 372 036 854 775 807
,您的值似乎已达到此限制,如果有符号整数的最高位为1,则有符号整数将变为负值(有关详细信息,请参阅2补码整数:)

您需要使用biginger来具有任意精度的整数。

公共静态void main(字符串[]args)
{
Map fibonacciMap=newhashmap();
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));

对于(int i=3;i
Long
溢出。请改用
biginger
。检查java.lang.Long.MAX_值。您可以看到在第92个斐波那契数之后出现非常好的负数。将其与java.lang.Long.MAX_值进行比较……这是一个注释,不是答案!我没有足够的声誉来添加注释:(@launet这样你就不会增加你的代表性。你只是在重复以前的评论。当我写我的答案时没有评论,我想帮忙him@laune我编辑我的答案,这似乎不是任何评论more@laune你是对的,在这种情况下必须使用BigInteger。我已经用这种方式编辑了我的答案。非常感谢大家!它的工作原理类似于c现在伤害。你能对你的解决方案发表评论,并描述问题是什么吗?因为java中long的最大值是9223372036854775807。所以,当斐波那契数超过这个最大值时,它开始从-9223372036854775808(最小值)四舍五入到零,到9223372036854775807(最大值).因此,我们需要使用BigDecimal而不是Long来避免-ve值。
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));
        }
    }