使用标识符 "long" 获取 negative/wrong 值
Getting negative/wrong values although using identifier "long"
我正在尝试计算第一个甚至四百万个斐波那契数的总和。然而,过了一会儿,随着值变大,只有 Y 值被打印出来,即使我使用的是 long 标识符。
这些是起始值:
long amount = 4000000;
long x = 1;
long y = 2;
long sum = 2;
这是一个 for 循环,在程序运行时汇总并打印出数字。
for (int i = 0; i < amount - 1; i++) {
if (x > y) {
y = x + y;
if (y % 2 == 0) {
sum += y;
}
System.out.println("X: " + x);
} else {
x = x + y;
if (x % 2 == 0) {
sum += x;
}
System.out.println("Y: " + y);
}
}
System.out.println("Summa: " + sum);
正确输出第一个斐波那契数:
Y: 2
X: 3
Y: 5
X: 8
Y: 13
X: 21
Y: 34
X: 55
Y: 89
X: 144
Y: 233
X: 377
一段时间后输出:
X: 8838822096666553613
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
为什么一段时间后只有 Y
得到计算?我的代码有错吗?
您正在计算的数字相当大...对于 Long 来说太大了。由于您正在进行整数计算,因此请将 long
替换为 BigInteger
。由于 BigInteger
是一个对象,您将无法使用 + 或 % 运算符,您需要使用方法调用 add()
和 mod()
.
a long
可以取的最大值是 9223372036854775807
(Long.MAX_VALUE
)。如果加法的结果超过该值,它将溢出并且 return 一个负值:
long x = 8838822096666553613L;
long y = 9212367363430683303L;
y = x + y;
将导致 y
值为 -395554613612314700
。因此,此比较将失败:
if (x > y) {
这就是为什么您只看到 Y
值被打印出来的原因
我正在尝试计算第一个甚至四百万个斐波那契数的总和。然而,过了一会儿,随着值变大,只有 Y 值被打印出来,即使我使用的是 long 标识符。
这些是起始值:
long amount = 4000000;
long x = 1;
long y = 2;
long sum = 2;
这是一个 for 循环,在程序运行时汇总并打印出数字。
for (int i = 0; i < amount - 1; i++) {
if (x > y) {
y = x + y;
if (y % 2 == 0) {
sum += y;
}
System.out.println("X: " + x);
} else {
x = x + y;
if (x % 2 == 0) {
sum += x;
}
System.out.println("Y: " + y);
}
}
System.out.println("Summa: " + sum);
正确输出第一个斐波那契数:
Y: 2
X: 3
Y: 5
X: 8
Y: 13
X: 21
Y: 34
X: 55
Y: 89
X: 144
Y: 233
X: 377
一段时间后输出:
X: 8838822096666553613
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
Y: 9212367363430683303
为什么一段时间后只有 Y
得到计算?我的代码有错吗?
您正在计算的数字相当大...对于 Long 来说太大了。由于您正在进行整数计算,因此请将 long
替换为 BigInteger
。由于 BigInteger
是一个对象,您将无法使用 + 或 % 运算符,您需要使用方法调用 add()
和 mod()
.
a long
可以取的最大值是 9223372036854775807
(Long.MAX_VALUE
)。如果加法的结果超过该值,它将溢出并且 return 一个负值:
long x = 8838822096666553613L;
long y = 9212367363430683303L;
y = x + y;
将导致 y
值为 -395554613612314700
。因此,此比较将失败:
if (x > y) {
这就是为什么您只看到 Y
值被打印出来的原因