Double数据精度导致的问题

早知道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
    }
相关推荐
专注数据的痴汉9 分钟前
「数据获取」全国民用运输机场吞吐量排名(2006-2024)
java·大数据·服务器·数据库·信息可视化
悟空码字35 分钟前
无缝集成指南,SpringBoot三步接入华为云短信服务
java·springboot·编程技术·后端开发·华为云短信
E_ICEBLUE40 分钟前
【2026 最新教程】Java 自动化提取 PDF 表格:从文本到 Excel/CSV 的全场景实现
java·pdf·自动化
C雨后彩虹42 分钟前
无向图染色
java·数据结构·算法·华为·面试
J_HelloWorld44 分钟前
缺页中断:Java高性能存储的隐形推手
java·缺页中断
一代明君Kevin学长1 小时前
记录一个上手即用的Spring全局返回值&异常处理框架
java·网络·python·spring
悟空码字1 小时前
SpringBoot整合MyBatis-Flex保姆级教程,看完就能上手!
java·spring boot·后端
爬山算法1 小时前
Hibernate(43)Hibernate中的级联删除如何实现?
java·python·hibernate
J_liaty1 小时前
Java工程师的JVM入门教程:从零理解Java虚拟机
java·开发语言·jvm
qq_2500568681 小时前
SpringBoot 引入 smart-doc 接口文档插件
java·spring boot·后端