Java中的长分区没有按预期工作

Aak*_*oel 7 java long-integer

class LongDiv{
public static void main(String [] args){

    final long x = 24*60*60*1000*1000;
    final long y = 24*60*60*1000;
    System.out.println(x/y);
}
}
Run Code Online (Sandbox Code Playgroud)

虽然预期的答案是1000,但javac给它为5.理由?

Mar*_*aux 13

x要创建不是您所期望的价值.它在整数范围内.要创建长片,请使用:

final long x = 24L*60L*60L*1000L*1000L;
final long y = 24L*60L*60L*1000L;
System.out.println(x/y);
Run Code Online (Sandbox Code Playgroud)

x你计算的,在整数的范围,是500654080.除以y(= 86400000),得到结果5.794607407407407....Java截断导致5的小数部分.

通过L在数字文字后添加一个,您可以告诉编译器将其编译为long而不是int.x你期望的价值是86400000000.但是被编译为int.

我们可以通过将它截断为int来为x(500654080)重现错误的值:

// First correct
long x = 24L*60L*60L*1000L*1000L;
/* x = `86400000000`; */
// Now truncate
x &= 0xFFFFFFFFL; // again: don't forget the L suffix
/* x = `500654080` */
Run Code Online (Sandbox Code Playgroud)

  • 每个表达式中只有一个文字需要是"long".见@ Peter的回答. (3认同)

Pet*_*rey 5

该表达式24*60*60*1000*1000 是一个int类型不是long 你想要的是24L*60*60*1000*1000这是long

这就是你拥有的.

final long x = (24*60*60*1000*1000) & 0xFFFFFFFF;
final long y = (24*60*60*1000) & 0xFFFFFFFF;
System.out.println(x/y);
Run Code Online (Sandbox Code Playgroud)

你想要的是什么

final long x = 24L*60*60*1000*1000;
final long y = 24L*60*60*1000;
System.out.println(x/y);
Run Code Online (Sandbox Code Playgroud)