当数字太大时如何修复溢出错误?
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
值在该类型范围的极端,那么你应该考虑一下精度损失会对你产生什么影响。
如何修复以下方法中的溢出错误?
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
值在该类型范围的极端,那么你应该考虑一下精度损失会对你产生什么影响。