繁体   English   中英

解析长到负数

[英]parse long to negative number

码:

public class Main{
    public static void main(String[] a){
        long t=24*1000*3600;
        System.out.println(t*25);
        System.out.println(24*1000*3600*25);
    }
}

打印:

2160000000

-2134967296

为什么?


感谢所有的答复。

是在数字后使用L的唯一方法吗?

我已经尝试过(long)24*1000*3600*25但这也是负面的。

您已达到int类型的最大值,即Integer.MAX_VALUE或2 ^ 31-1。 因此,它被包裹了,因此显示为负数。

有关此内容的即时说明,请参见此漫画:

替代文字

为了清楚地解释,

System.out.println(24*1000*3600*25);

在上面的语句中实际上是int文字。 要将它们视为long字面量,您需要在L后缀后缀。

System.out.println(24L*1000L*3600L*25L);

请注意,一个小的l也足够,但是有时看起来像大写的I1 资本I在这里没有多大意义,但是读为1确实会给你带来困难。 此外,即使L满足单个值也将使结果long

在第一种情况下,您将打印很long而在第二种情况下,您将其打印为int

而且int的范围是:-2 ^ 31到2 ^ 31-1,它正好在您要计算的范围以下(int max:2147483647您:2160000000),因此您会将int溢出到负数范围。

您也可以强制第二个使用long

System.out.println(24L*1000*3600*25);

您应该在数字后加上'l'。 检查以下代码段:

   public static void main(String[] a){
        long t=24*1000*3600;
        System.out.println(t*25);
        System.out.println(24l*1000l*3600l*25l);
    }

默认情况下,积分文字被视为int类型。 24*1000*3600*25大于Integer.MAX_VALUE因此会溢出并评估为-2134967296。 您需要使用L后缀明确地使其中之一变long ,以得到正确的结果:

System.out.println(24L*1000*3600*25);

如果要使用大数值进行数学运算而又不会溢出,请尝试使用BigDecimal类。

假设我想乘

200,000,000 * 2,000,000,000,000,000,000L * 20,000,000

int testValue = 200000000;
System.out.println("After Standard Multiplication = " +
                                                       testValue * 
                                                       2000000000000000000L * 
                                                       20000000);

该操作的值将是-4176287866323730432,这是不正确的。

通过使用BigDecimal类,您可以消除丢失的位并获得正确的结果。

int testValue = 200000000;        
System.out.println("After BigDecimal Multiplication = " +
                              decimalValue.multiply(
                              BigDecimal.valueOf(2000000000000000000L).multiply(
                              BigDecimal.valueOf(testValue))));

使用BigDecimal之后,乘法运算会返回正确的结果,即

80000000000000000000000000000000000000000

(int)Long.valueOf("2345678901").longValue();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM