【问题标题】:Multiplying long values?乘以长值?
【发布时间】:2010-12-02 11:10:04
【问题描述】:
class Main {  
   public static void main (String[] args){  
     long value = 1024 * 1024 * 1024 * 80;  
     System.out.println(Long.MAX_VALUE);  
     System.out.println(value);  
  }  
}

输出是:

9223372036854775807 0

long value = 1024 * 1024 * 1024 * 80L;是正确的!

【问题讨论】:

    标签: java type-conversion


    【解决方案1】:

    在 Java 中,所有数学运算都是在处理所有当前值所需的最大数据类型中完成的。所以,如果你有 int * int,它总是以整数来计算,但 int * long 是以 long 来计算的。

    在这种情况下,1024*1024*1024*80 是作为 Int 完成的,它会溢出 int。

    “L”当然会强制其中一个操作数为 Int-64(long),因此所有数学运算都已完成,将值存储为 Long,因此不会发生溢出。

    【讨论】:

    • 算术运算,比如说,shorts 不是作为 shorts 完成的,而是作为 ints 完成的。
    • Tom- 这很有趣,我从来不知道。我刚刚用两条短裤(在 C# 中,但类似的操作)对其进行了测试,它确实将数学作为整数进行......它必须只是使用 Int 作为普通数字类型的默认值。
    • 即短 x = 0;短 y = 0; x = x + y;会出现类型不匹配错误。
    • Prateek- 它没有,编译器足够聪明,可以进行区分。
    • Prattek:这里有一些目标输入。您也可以使用myShort += anotherShort;,但不能使用myShort = myShort + anotherShort;。我喜欢任意精度整数...
    【解决方案2】:

    整数字面量是ints。 ints 溢出。使用L 后缀。

    long value = 1024L * 1024L * 1024L * 80L;
    

    如果数据来自变量,则预先转换或分配给 long。

    long value = (long)a * (long)b;
    
    long aL = a;
    long bL = b;
    long value = aL*bL
    

    严格来说,你可以用更少的东西来逃避,但最好清楚一点。

    也不是小写的l 作为后缀可能会混淆为1

    【讨论】:

      【解决方案3】:

      我怀疑这是因为默认情况下 java 将文字视为整数,而不是长整数。所以,如果没有 80 上的 L,乘法就会溢出。

      【讨论】:

        【解决方案4】:

        这段代码:

        long value = 1024 * 1024 * 1024 * 80; 
        

        将一些整数相乘,将其转换为长整数,然后将结果分配给变量。实际的乘法将由 javac 完成,而不是在运行时完成。

        由于 int 是 32 位,因此该值被包装并产生零。

        如您所说,在右侧使用 long 值将产生仅在超过 64 位时才换行的结果。

        【讨论】:

          【解决方案5】:

          如果我理解正确,根据您的要求,您想将这些值相乘1024 * 1024 * 1024 * 80;

          在计算器中,我看到的值为 1024 * 1024 * 1024 * 80=85899345920。

          这里是你的java代码:这些是java中的货币价值计算

          import java.math.BigDecimal;
          public class Demo {
              public static void main(String[] args) {
                  BigDecimal bd1 = new BigDecimal("1024");
                  BigDecimal bd2 = new BigDecimal("1024");
                  BigDecimal bd3 = new BigDecimal("1024");
                  BigDecimal bd4 = new BigDecimal("80");
                  BigDecimal bd5 = bd1.multiply(bd2).multiply(bd3).multiply(bd4);
                  System.out.println(bd5); // output comes: 85899345920
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2015-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多