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
    }
相关推荐
带刺的坐椅4 分钟前
Solon AI 开发学习16 - generate - 生成模型(图、音、视)
java·ai·llm·openai·solon
jiayong237 分钟前
Spring Bean 生命周期详解
java·后端·spring
卿雪12 分钟前
缓存异常:缓存击穿、缓存穿透、缓存雪崩 及其解决方案
java·数据库·redis·python·mysql·缓存·golang
小坏讲微服务19 分钟前
Spring Boot 4.0 整合 RabbitMQ 注解方式使用指南
java·spring boot·rabbitmq·java-rabbitmq
星辰烈龙19 分钟前
黑马程序员Java基础7
java·开发语言
big-seal20 分钟前
分页列表中能够按照名称查询,使用 mybatis 的 Example 动态构造 SQL where 条件
java·开发语言
福尔摩斯张21 分钟前
C语言文件操作详解(一):文件的打开与关闭(详细)
java·linux·运维·服务器·c语言·数据结构·算法
廋到被风吹走23 分钟前
【Spring】依赖注入的实现方式对比
java·spring
Zzzzzxl_24 分钟前
互联网大厂Java/Agent面试实战:Spring Boot、JVM、微服务与AI Agent/RAG场景问答
java·jvm·spring boot·ai·agent·rag·microservices
未若君雅裁26 分钟前
JVM高级篇总结笔记
java·jvm·笔记