问题描述
|
在Java采访中有人问我这个问题:我被要求找出float数组中元素的总和。但是,元素包含非常大的数字和非常小的数字,问题是,如何保证摘要的准确性?
我想这需要对Java中的Float实现有一些体面的理解,但我很遗憾缺乏这种理解,或者这是一个合理的问题吗?
解决方法
我怀疑面试官所追求的是对浮点取整的基本了解。从最小(最大)到最大(幅度)数字相加得到的舍入误差最小,因此第一步是对数组进行相应排序。然后,您还可以通过推荐使用Kahan求和算法来打动面试官。
, 简单的答案是使用BigDecimal。这种类型可以容纳任意大的值。
如何做这样的总和的基本示例:
public BigDecimal sum(float[] floats) {
BigDecimal sum = BigDecimal.ZERO;
for (float aFloat : floats) {
sum = sum.add(new BigDecimal(aFloat));
}
return sum;
}
, 如果为了牺牲精度而牺牲性能,则可以将浮点数转换为BigDecimals并求和。
, 您可以使用BigDecimal Java类型。