施放Math.pow()时精度损失

mat*_*at1 3 java int casting

我试图计算int的最大值,但是我无法弄清楚为什么转换为int的计算值低于转换为long时的计算值.我提出(2^31) - 1了计算器,价值是

2_147_483_647
Run Code Online (Sandbox Code Playgroud)

当我在Java中上升2^31和减去时,我会期望相同1,它应该计算int的最大数量2147483647,但事实并非如此.

System.out.println(((long) Math.pow(2, 31)) - 1); 
System.out.println((int) Math.pow(2, 31) - 1); 
Run Code Online (Sandbox Code Playgroud)

第一个计算给出: 2_147_483_647

第二次计算给出: 2_147_483_646

nos*_*nos 5

演员阵容优先于减法.你应该先做减法:

 System.out.println((int) (Math.pow(2, 31) - 1)); 
Run Code Online (Sandbox Code Playgroud)
  • Math.pow(2, 31)是2_147_483_648一个类型double(因为Math.pow()返回一个double),这个数字不适合int.

  • 当您将double 2_147_483_648转换为int时,它会被截断为int可以容纳的最大值(请参阅如何在Java中使用double转换为int).

  • 强制转换将double截断2_147_483_648为int 2_147_483_647.

  • 然后你的代码减去1,最后结束 2_147_483_646.