Double数据累加后导致精度失准处理

发布时间:2023年12月21日

Double数据累加后导致精度失准处理

问题描述

问题如下:当数据相加等于0.3、0.6等时就会失去精度,直接打印0.3是没有问题的

	public static void main(String[] args) {
        Double d1 = 0.1;
        Double d2 = 0.1;
        Double d3 = 0.1;
        Double d4 = 0.3;

        //直接d1+d2+d3 = 0.30000000000000004
        System.out.println(d1+d2+d3);
        //d1+d2 = 0.2
        System.out.println(d1+d2);
        //d4 = 0.3
        System.out.println(d4);
        //直接d1+d2+d3+d1+d4 = 0.7
        System.out.println(d1+d2+d3+d1+d4);
        //直接d1+d2+d3+d4 = 0.6000000000000001
        System.out.println(d1+d2+d3+d4);
    }

处理

	//转化为bigDeiceml
	 public static void main(String[] args) {
        Double d1 = 0.1;
        Double d2 = 0.1;
        Double d3 = 0.1;
        Double d4 = 0.3;

        //直接d1+d2+d3 = 0.3
        System.out.println(doubleAdd(d1,d2,d3));
        //d1+d2 = 0.2
        System.out.println(doubleAdd(d1,d2));
        //d4 = 0.3
        System.out.println(d4);
        //直接d1+d2+d3+d1+d4 = 0.7
        System.out.println(doubleAdd(d1,d2,d3,d1,d4));
        //直接d1+d2+d3+d4 = 0.6
        System.out.println(doubleAdd(d1,d2,d3,d4));
    }

    /**
     * 封装个方便调用的方法
     *
     * @param d1
     * @param d2
     * @return
     */
    public static Double doubleAdd(Double d1,Double d2){
    	//这里一定要将double数据转化为String后再转化bigDecimal 不然数据计算还是会失去精度
        BigDecimal decimal1 = new BigDecimal(Double.toString(d1));
        BigDecimal decimal2 = new BigDecimal(Double.toString(d2));
        return decimal1.add(decimal2).doubleValue();
    }

    /**
     * 封装个方便多数值相加的方法
     * @param d
     * @return
     */
    public static Double doubleAdd(Double... d){
        return Arrays.stream(d).reduce((a, b) -> doubleAdd(a, b).doubleValue()).get();
    }
文章来源:https://blog.csdn.net/qq_39771919/article/details/135131306
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。