網頁

2017/9/29

Java 整數計算的溢位overflow問題

Java在做數值相乘時,有可能因為計算結果超過intlong的上限而發生溢位(arithmetic overflow)進而導致結果錯誤。

要預防計算時出現溢位,可使用Java 8才有的Math.multiplyExact(),使用此方法來相乘兩個數值,若發生溢位則會拋出ArithmeticException錯誤,然後錯誤發生時用try-catch block捕捉並處理。

下面範例使用兩數值相加造成溢位,並使用Math.addExact()相加。

int x = Integer.MAX_VALUE; // 2147483647 
int y = 1;
System.out.println(x + y); // integer overflow -9223372036854775808

try{
  Math.addExact(x, y);
}catch(ArithmeticException e){
  System.out.println("x + y 造成溢位並丟出ArithMeticException");
}

  
long m = Long.MAX_VALUE; // 9223372036854775807
long n = 1;
System.out.println(m + n); // long overflow -9223372036854775808

try{
  Math.addExact(m, n);
}catch(ArithmeticException e){
  System.out.println("m + n 造成溢位並丟出ArithMeticException");
}

輸出結果如下

-2147483648
x + y 造成溢位並丟出ArithMeticException
-9223372036854775808
m + n 造成溢位並丟出ArithMeticException

如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。

沒有留言:

張貼留言