早知道double的数据精度有限,所以在计算金钱等精细数据的时候,要用bigdecimal;
但是最近在计算一些客流量数据数据的时候,也发现,这种数据精度不足的情况,会不仅仅导致小数点级的计算结果出错
实在是,该踩得坑的都得踩一遍
经验就是:可以分页查询,但是不要分页计算
java
public static void main(String[] args) {
ArrayList<Double> doubles = new ArrayList<>();
doubles.add(100.0);
doubles.add(200.0);
doubles.add(300.0);
doubles.add(400.0);
doubles.add(500.0);
doubles.add(600.0);
doubles.add(700.0);
doubles.add(800.0);
doubles.add(900.0);
doubles.add(1000.0);
int pageSize = 3;
// 计算总页数
int totalPage = (doubles.size() + pageSize - 1) / pageSize;
List<Double> averageUvListForSum = new ArrayList<>();
for (int pageNum = 0; pageNum < totalPage; pageNum++) {
// 计算当前页的开始索引
int fromIndex = (pageNum) * pageSize;
// 防止结束索引超出数组长度
int toIndex = Math.min(fromIndex + pageSize, doubles.size());
List<Double> doubles1 = doubles.subList(fromIndex, toIndex);
Double averageUvByPage = doubles1.stream().mapToDouble(Double::doubleValue).average().orElse(0.0);
//分页计算,从数学上是行的通的,但是计算机的double精度会导致计算错误
Double averageUvForSum = (averageUvByPage)/(doubles.size()/(toIndex - fromIndex));
averageUvListForSum.add(averageUvForSum);
}
//分页计算平平均值
double sum = averageUvListForSum.stream().mapToDouble(Double::doubleValue).sum();//600.0
//Stream计算平均值
double v = doubles.stream().mapToDouble(Double::doubleValue).average().orElse(0.0);//550.0
}