【问题标题】:Why does this not result in 1000? [duplicate]为什么这不会导致 1000? [复制]
【发布时间】:2011-06-29 19:09:13
【问题描述】:

可能重复:
Java problem-Whats the reason behind and what will be probable output

long milli=24*60*60*1000;
long micro=24*60*60*1000*1000;
long result=micro/milli;

结果应该是 1000 但不是。为什么当我使用24*60*60*1000*1000L 时它会起作用?

谁能告诉我这是什么原因?

【问题讨论】:

  • 你得到了什么结果?
  • Repost of your previous question 今天也恰好包含答案。
  • 你超出了int范围,需要告诉VM使用long。
  • 这个问题太简单了,我输入的时候还有四个答案...
  • 我觉得这有点是我的错。 Rakesh 以编辑的形式在他的原始帖子中添加了一个新问题 - “任何人都可以告诉我有关 VM...在 JAVA 中处理数字” - 我告诉他,如果他希望这个问题引起注意,他应该问一个新问题。要么我不清楚,要么他不明白:S

标签: java numbers int long-integer


【解决方案1】:

问题是计算是在ints 上完成的,然后转换为long,不幸的是24*60*60*1000*1000 不适合int 并环绕。你可以做类似的事情

long micro=24L*60*60*1000*1000;

强制对 long 进行最后一次乘法运算。

【讨论】:

  • 补充这个(正确的)答案:因为右边的所有项都是整数,所以算术,包括溢出,将在整数上完成。然后将结果转换为 long。通过在右侧添加 'L' 或(long),您可以强制将所有整数扩大转换为 long(在它溢出之前)并且结果不会溢出。
【解决方案2】:

24*60*60*1000*1000 可能被视为 int 并被截断。

要强制将其视为长整数,请将其中的一个(或所有)数字设为长整数,并在其后加L

24L*60L*60L*1000L*1000L

【讨论】:

    【解决方案3】:

    很简单,如果你知道的话,但总是有惊喜 ;)

    文字 1000 是一个 int 值,所以乘法是用整数完成的,而 not 是用 long 完成的。

    long micro=24*60*60*1000*1000;
    

    被解释为

    long micro = (long) ((int) 24*60*60*1000*1000);
    

    这是500654080 而不是86400000000

    在表达式中至少使用一个长文本,这会强制整个计算在 long 中完成:

    long milli=24*60*60*1000;
    long micro=24*60*60*1000*1000 * 1L; // forces a calculation in long
    long result=micro/milli;
    

    【讨论】:

      【解决方案4】:

      当您告诉 Java 将 int 值相乘(并且整数文字始终为 int 类型,除非您附加 lL),那么结果将始终int 类型也是如此。 24*60*60*1000*1000 导致溢出,因为它大于最大可能的 int 值 (Integer.MAX_VALUE)。

      然后(在通过切割最高有效位“解决”溢出后),该值被分配给long 值。

      将其中一个数字指定为long (1000L) 意味着整个乘法是用long 数字完成的。

      【讨论】:

      • joachim 感谢帮助....有同样的问题 2) int i=0; for(a=0;a
      • @Rakesh:请单独提出一个问题,cmets 并不是真正适合进行此类讨论的地方。
      【解决方案5】:

      您的问题是int 数据类型仅支持直到大约 2000000000 的数字,而您的数字是 86400000000,大约是这个数字的 40 倍。因此,您的乘法环绕(丢弃结果的最高位)。

      因此,您需要切换到下一个更大的数据类型 long,告诉 Java 至少有一个数字是这样设计的:

       long micro=24*60*60*1000*1000L;
      

      那么你的结果就是对的。

      【讨论】:

        【解决方案6】:

        这是因为您正在执行整数(32 位)算法,然后将 int 结果转换为 long。由于数字太大,它不起作用。

        替换为:

        long milli=24*60*60*1000L;
        long micro=24*60*60*1000*1000L;
        long result=micro/milli;
        

        强制操作确实使用 longs 来完成。

        【讨论】:

          【解决方案7】:

          int 可以容纳的最大值是Integer.MAX_VALUE,并且您的宏值大于整数可以容纳的值,并且对整数进行计算,因此它被截断。如果您将其中一个乘数设为长(以 L 或 l 结尾),它将正确计算。

          long milli=24*60*60*1000;
          long micro=24*60*60*1000*1000L;
          long result=micro/milli;
          

          【讨论】:

            猜你喜欢
            • 2013-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-03
            相关资源
            最近更新 更多