为什么 Math.Pow(x,y) 使用 double 而不是 long?

问题描述

我们需要使用 longLong.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 时得到,因为乘法按预期工作,与从双精度转换不同。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...