2016-12-15 12 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', чем не использовать' long' и вместо этого использовать 'BigInteger' – ifly6

+0

' BigDecimal' может вам помочь. – MordechayS

+0

Это целые данные – ifly6

ответ

1

Эта линия может переполниться, если эти два числа слишком велики:

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

Как это исправить?

Проблема возникает с промежуточным добавлением. Если вы можете полагаться на элементах 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 значениях в крайних концах диапазона этого типа, тогда вам следует подумать о том, какой эффект будет иметь точная потеря.