当数字太大时如何修复溢出错误?

How can I fix overflow error when numbers can be too big?

如何修复以下方法中的溢出错误?

  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;

如何解决这个问题?

This line may overflow if the two numbers are too big:

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

How to fix this?

问题出现在中间加法上。如果你可以依赖 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 值在该类型范围的极端,那么你应该考虑一下精度损失会对你产生什么影响。