2016-12-15 3 views
2

Comment puis-je corriger l'erreur de débordement dans la méthode ci-dessous?Comment réparer une erreur de débordement lorsque les nombres peuvent être trop grands?

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; 
    } 
    } 

Cette ligne peut déborder si les deux chiffres sont trop gros:

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

Comment résoudre ce problème?

+0

Ajoutez du code pour vérifier qu'ils ne débordent pas, et s'ils le font, faites quelque chose. Il n'y a pas grand-chose que vous pouvez faire avec un 'long' débordant autre que ne pas utiliser' long's et à la place utiliser un 'BigInteger' – ifly6

+0

' BigDecimal' peut vous aider. – MordechayS

+0

Il s'agit de données entières – ifly6

Répondre

1

Cette ligne peut déborder si les deux chiffres sont trop gros:

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

Comment résoudre ce problème?

Le problème se pose avec l'addition intermédiaire. Si vous pouvez compter sur les éléments de numbers être, alors non-négatif, vous pouvez effectuer le calcul sans risque de débordement comme ceci:

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

comme @EricS mentionnés dans les commentaires.

Si vous devez tenir compte de la gamme complète de long, positif et négatif, alors vous pouvez le faire:

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

Soyez conscient que double a une plus grande portée, mais moins de précision que long, au sens de le nombre de chiffres significatifs que chacun peut représenter. Si vous avez vraiment besoin de vous soucier des valeurs long aux extrémités de la plage de ce type, vous devriez penser à l'effet que cette perte de précision aura sur vous.