2016-12-15 14 views
2

以下の方法でオーバーフローエラーを修正する方法はありますか?数値が大きすぎる場合、オーバーフローエラーを修正するにはどうすればよいですか?

public static double median(long[] numbers) { 
    Arrays.sort(numbers); 
    int middle = numbers.length/2; 
    if (numbers.length % 2 == 1) { 
     return numbers[middle]; 
    } else { 
     return (numbers[middle - 1] + numbers[middle])/2.0; 
    } 
    } 

二つの数字が大きすぎる場合は、この行はオーバーフローすることがあります。

return (numbers[middle - 1] + numbers[middle])/2.0; 

この問題を解決する方法は?

+0

オーバーフローしないことを確認するコードを追加し、オーバーフローしないことを確認するコードを追加します。 'long'を使わず、' BigInteger'を使う代わりに 'long'をあふれさせることはできません。 – ifly6

+0

' BigDecimal'がお手伝いします。 – MordechayS

+0

整数データです – ifly6

答えて

1

二つの数字が大きすぎる場合は、この行はオーバーフローすることがあります。

return (numbers[middle - 1] + numbers[middle])/2.0; 

この問題を解決する方法は?

問題が中間加算で発生します。コメントで述べた@EricSとして

return numbers[middle - 1] + (numbers[middle] - numbers[middle - 1])/2.0; 

:あなたは非負であることをnumbersの要素に頼ることができる場合は、そのようなオーバーフローの危険性なしに計算を実行することができます。

あなたは、あなたがこれを行うことができ、正と負、longの全範囲に対応する必要がある場合:

return numbers[middle - 1]/2.0 + numbers[middle]/2.0; 

doubleはという意味で、longより大きい範囲未満の精度を持っていることに注意してください。それぞれが表すことができる有効数字の数。そのタイプの範囲の極端にlongの値を本当に心配する必要がある場合は、精度損失があなたに与える影響について考える必要があります。

関連する問題