2016-12-15 1 views
2

어떻게 아래의 방법으로 오버플로 오류를 해결할 수 있습니까?숫자가 너무 커지면 어떻게 오버플로 오류를 해결할 수 있습니까?

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

방법이 문제를 해결하려면 다음 두 숫자가 너무 큰 경우

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

이 행 오버 플로우 수있다?

중간 추가시 문제가 발생합니다. 당신은 음이 아닌 것으로 numbers의 요소에 의존 할 수있는 경우에, 당신은과 같이 오버 플로우의 위험없이 계산을 수행 할 수 있습니다 의견에 언급

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

로 @EricS을. 당신이 긍정적이고 부정적인 long의 전체 범위를 수용 할 수있는 경우

, 당신은이 작업을 수행 할 수 있습니다

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

는 의미에서, double 큰 범위하지만 long 이하의 정밀도를 가지고 있음을 알고 있어야합니까 각각이 나타낼 수있는 유효 숫자의 수. 해당 유형 범위의 끝에서 long 값에 대해 정말로 걱정할 필요가 있다면, 정밀 손실이 당신에게 미치는 영향에 대해 생각해야합니다.

관련 문제