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

ppcbkaq5  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(372)

我们需要使用long和long.tounsignedstring()作为rice的类型,但是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
...
v2g6jxz6

v2g6jxz61#

你可以很容易地回溯到 long :

System.out.println("Feld: " + feld + ", Reiskörner: " + (long) Math.pow(2, rk));

但你应该注意到 Math.pow(2,63) 太大,无法放入长变量。
最大值 long 值为263-1。
你也可以避免 Math.pow() 如果使用shift运算符:

System.out.println("Feld: " + feld + ", Reiskörner: " + Long.toUnsignedString ((1L << rk)));

注意我用了 Long.toUnsignedString 以便正确打印263。

rdlzhqv9

rdlzhqv92#

在循环中多次调用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;
    }
}

这也适用于长负数(打印为无符号),例如当结果太大而无法放入有符号的长负数时,因为乘法的效果与预期的一样,不同于从double转换。

相关问题