问题描述
我们需要使用 long 和 Long.toUnsignedString() 作为米饭的类型,但是 Math.Power 将其更改为 double:
package com.company;
public class Main {
public static void main(String[] args) {
int rk = 0;
for (byte feld = 1; feld < 65; feld++) {
System.out.println("Feld: " + feld + ",Reiskörner: " + Math.pow(2,rk));
rk = rk+1;
}
}
}
我测试了很多东西,但没有任何效果。 输出是:
Feld: 1,Reiskörner: 1.0
Feld: 2,Reiskörner: 2.0
Feld: 3,Reiskörner: 4.0
...
Feld: 63,Reiskörner: 4.6116860184273879E18
Feld: 64,Reiskörner: 9.223372036854776E18
插入:
Feld: 1,Reiskörner: 1
Feld: 2,Reiskörner: 2
...
解决方法
您可以轻松转换回long
:
System.out.println("Feld: " + feld + ",Reiskörner: " + (long) Math.pow(2,rk));
但您应该注意 Math.pow(2,63)
太大而无法放入长变量。
最大 long
值为 263-1。
如果使用移位运算符,也可以避免 Math.pow()
:
System.out.println("Feld: " + feld + ",Reiskörner: " + Long.toUnsignedString ((1L << rk)));
请注意,我使用 Long.toUnsignedString
是为了正确打印 263。
在循环中多次调用 Math.pow() 是低效的,而您需要做的只是每次乘以 2:
public static void main(String[] args) {
long rk = 1;
for (byte feld = 1; feld < 65; feld++) {
System.out.println("Feld: " + feld + ",Reiskörner: " + Long.toUnsignedString(rk));
rk *= 2;
}
}
这也适用于长负数(打印为无符号数),例如当结果太大而无法放入有符号 long 时得到,因为乘法按预期工作,与从双精度转换不同。