我试图计算 int 的最大值,但是我不明白为什么转换为 int 的计算值低于转换为 long 的计算值。我在计算器上计算了(2^31) - 1
,结果是
2_147_483_647
当我在 Java 中增加 2^31
并扣除 1
时,我会期望相同,它应该计算 int 2147483647
的最大数量,但事实并非如此。
System.out.println(((long) Math.pow(2, 31)) - 1);
System.out.println((int) Math.pow(2, 31) - 1);
第一次计算给出:2_147_483_647
第二次计算给出:2_147_483_646
最佳答案
转换优先于减法。你应该先做减法:
System.out.println((int) (Math.pow(2, 31) - 1));
Math.pow(2, 31)
是2_147_483_648
,类型为double
(因为 Math.pow() 返回a double) ,这个数字不适合 int。当您将 double
2_147_483_648
转换为 int 时,它会被截断为 int 可以容纳的最大值(请参阅 How does double to int cast work in Java )。转换将 double
2_147_483_648
截断为整型2_147_483_647
。- 然后您的代码减去 1,并以
2_147_483_646
结尾。
关于java - 类型转换 Math.pow() 时精度损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47697294/