如何解决为什么 Math.Pow(x,y) 使用 double 而不是 long?
我们需要使用 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 时得到,因为乘法按预期工作,与从双精度转换不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。