java - 类型转换 Math.pow() 时精度损失

标签 java casting int

我试图计算 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/

相关文章:

c# - 如何 - 将一个整数拆分为两个整数?

java BufferedImage 到 int[] 问题

java - @Autowired 在 EndpointInterceptor 中不起作用

java - org.apache.kafka.common.errors.UnknownTopicOrPartitionException : This server does not host this topic-partition 错误

java - 外键约束在一对多上失败

c# - 为什么不能将 Dictionary<T1, List<T2>> 转换为 Dictionary<T1, IEnumerable<T2>>?

python - 错误 "invalid literal for int() with base 10:"不断出现

java - 声学模型路径未设置正确 CMU Sphinx

c++ - 子类转换和指针地址更改

c - 如何从 2 个结构指针访问元素?