Java stream求和以及mapToDouble sum精度丢失解决办法

在 Java 8 中,Stream.reduce()合并流的元素并产生单个值。

基本数据类型 和 包装类型 的一位数组求和

package test day1;

import java.util.Arrays;


public class Test {
    public static void main(String[] args) {
        // 基本数据类型  int long  double
        int[] arr2 = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int sum2 = Arrays.stream(arr2).sum();

        long[] arr3 = new long[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        long sum3 = Arrays.stream(arr3).sum();

        double[] arr5 = new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        double sum5 = Arrays.stream(arr5).sum();



        // 包装类型  Integer Long  Double
        Integer[] arr4 = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        Integer sum4 = Arrays.stream(arr4).mapToInt(Integer::intValue).sum();

        Long[] arr6 = new Long[]{1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L};
        Long sum6 = Arrays.stream(arr6).mapToLong(Long::longValue).sum();

        Double[] arr7 = new Double[]{1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
        Double sum7 = Arrays.stream(arr7).mapToDouble(Double::doubleValue).sum();

        System.out.println("sum2 = " + sum2);
        System.out.println("sum3 = " + sum3);
        System.out.println("sum4 = " + sum4);
        System.out.println("sum5 = " + sum5);
        System.out.println("sum6 = " + sum6);
        System.out.println("sum7 = " + sum7);
    }
}

其中double求和会丢失精度,

可以使用如下办法解决:

将集合中Double对象转为BigDecimal对象在进行计算

        result = list.stream().map(e->new BigDecimal(String.valueOf(e))).collect(Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)).doubleValue();

代码示例:

package day1;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author lh
 * @date 2023/8/14 11:30 AM
 */
public class TestBigDecimal1 {

    public static void main(String[] args) {
        double result = 0;
        List<Double> doubleList = new ArrayList<>(Arrays.asList(6.6, 1.3));
        Double sumD = doubleList.stream().mapToDouble(Double::doubleValue).sum();
        System.out.println(sumD); //丢失精度

        result = doubleList.stream().map(e->new BigDecimal(String.valueOf(e))).collect(Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)).doubleValue();
        System.out.println(result);

        result = doubleList.stream().map(BigDecimal :: valueOf).collect(Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)).doubleValue();
        System.out.println(result);

        result = doubleList.stream()
                .map(BigDecimal::valueOf)
                .reduce(BigDecimal::add)
                .orElse(BigDecimal.ZERO).doubleValue();
        System.out.println(result);


    }

}

结果:

7.8999999999999995
7.9
7.9
7.9

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值