【问题标题】:Integer division: Why it print wrong value? [duplicate]整数除法:为什么打印错误的值? [复制]
【发布时间】:2019-05-31 18:16:59
【问题描述】:
public class PragsLongDivision{

public static void main (String [] args){
 final long MICRO_PER_DAY=24 * 60 * 60 * 1000 * 1000;
 final long MILLIS_PER_DAY= 24 * 60 * 60 * 1000;

  System.out.println(MICRO_PER_DAY / MILLIS_PER_DAY  );

   }
}

这个程序打印 5 为什么?请有理由分享最好的问候。

【问题讨论】:

标签: java integer long-integer


【解决方案1】:

在这些行中:

 final long MICRO_PER_DAY=24 * 60 * 60 * 1000 * 1000;
 final long MILLIS_PER_DAY= 24 * 60 * 60 * 1000;

每个常量整数都是int 类型,计算的结果也是int 类型。
但您会得到预期的结果:MICRO_PER_DAY86400000000 太大,无法容纳 int 的 32 位,因此会被截断。
这称为数值溢出
要获得正确的结果,请使用:

 final long MICRO_PER_DAY=24L * 60 * 60 * 1000 * 1000;
 final long MILLIS_PER_DAY= 24L * 60 * 60 * 1000;

24 之后的 L 后缀将指导编译器,以便它确实将结果存储在 long 类型的 64 位中,而不是截断它。

【讨论】:

  • 这并不是真正将结果存储为 long 使这项工作:它是使用 long 执行计算。结果是您需要将结果存储为 long,但这不是主要原因。
  • 使用 long 执行计算 每个计算都会产生一个存储为 long 的结果。 但这不是主要原因这是什么意思?
  • long a = Integer.MAX_VALUE * Integer.MAX_VALUE; 存储结果为 long,但 用整数计算
  • long a = Integer.MAX_VALUE * Integer.MAX_VALUE; finally 将结果存储在 long 的 64 位中,但是这个结果被计算为int,这就是它错误的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2021-12-15
相关资源
最近更新 更多