【问题标题】:Unexpected Negative Numbers in JavaJava中意外的负数
【发布时间】:2015-07-15 20:58:34
【问题描述】:
    import java.util.*;
    public class Prac9FibonacciNumbers {

public static void main(String[] args) {

    int[] x = new int[100];
    x[0] = 1;
    x[1] = 1;

    for (int a = 2; a < 100; a++) {

        x[a] = x[a - 1] + x[a - 2];

    }

    for (int a = 0; a < 100; a++) {

        if(a < 99){

            System.out.print(x[a] + ",");

        }
                else{

                System.out.print(x[a]);

                }

            }

        }

    }

该程序旨在创建斐波那契数列。但是,由于某种原因,它在我的输出中间给了我负数。

我可以使用

    Math.abs()

但我想知道为什么它给了我负数。输出在下面。请帮助我理解这个问题。

1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368,75025,121393,196418,317811,514292 ,832040,1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,165580141,267914296,433494437,701408733,1134903170,1836311903,-1323752223,512559680,-811192543,-298632863,-1109825406, - 1408458269,1776683621,368225352,2144908973,-1781832971,363076002,-1418756969,-1055680967,1820529360,764848393,-1709589543,-944741150,1640636603,695895453,-1958435240,-1262539787,1073992269,-188547518,885444751,696897233,1582341984, -2015728079,-433386095,1845853122,1412467027,-1036647147,375819880,-660827267,-285007387,-945834654,-1230842041,2118290601,887448560,-1289228135,-401779575,-1691007710,-2092787285,511172301,-1581614984,-1070442683 ,1642909629,572466946,-2079590721,-1507123775,708252800,-798870975,-90618175,-889489150,-980107325

【问题讨论】:

  • 整数值出现正溢出,请改用long
  • 那只会推迟问题。我将在第 92 个整数处得到负数

标签: java fibonacci


【解决方案1】:

斐波那契数将增长得相当快。在第 46 个数字处,您开始得到负数,例如-1323752223。这是因为数字变得如此之大,以至于溢出了 int 数据类型。

您可以使用long[] 数组,但这只会推迟问题。您将在第 92 个数字处开始获得负数,例如-6246583658587674878,因为它会溢出 long 数据类型。

使用double 将无法达到此量级所需的精度。您可以使用BigIntegers,它具有任意精度和幅度。

BigInteger[] x = new BigInteger[100];
x[0] = BigInteger.ONE;
x[1] = BigInteger.ONE;

您需要使用add 方法。

x[a] = x[a - 1].add(x[a - 2]);

【讨论】:

    【解决方案2】:

    来自Java Language Specification section关于整数运算:

    内置整数运算符不会以任何方式指示上溢或下溢。 结果由语言指定,与 JVM 版本无关:Integer.MAX_VALUE + 1 == Integer.MIN_VALUE 和 Integer.MIN_VALUE - 1 == Integer.MAX_VALUE。其他整数类型也是如此。

    如果你这样做:

    int x = 2147483647;
    x++;
    

    如果您现在打印出 x,它将是值 -2147483648

    使用biginteger 数据类型来声明您的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      相关资源
      最近更新 更多