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  doubleint[] 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  DoubleInteger[] 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/68816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对可再生能源和微电网集成研究的新控制技术和保护算法进行基线和测试及静态、时域和频率分析研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于React实现:弹窗组件与Promise的有机结合

背景 弹窗在现代应用中是最为常见的一种展示信息的形式&#xff0c;二次确认弹窗是其中最为经典的一种。当我们在React&#xff0c;Vue这种数据驱动视图的前端框架中渲染弹窗基本是固定的使用形式。 使用方式&#xff1a;创建新的弹窗组件&#xff0c;在需要弹窗的地方引用并…

【系统设计系列】 回顾可扩展性

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…

【MySQL】mysql | 数据量统计

一、概览 1、统计数据库信息 2、主要指标涉及&#xff1a; 数据表数量/字段总量/存储条数/存储量 二、命令 1、数据表数量 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema 库名; 某个库中&#xff0c;有多少个表 ~~ 2、字段总量 selectsum(FIELD_COUNT…

平面设计的三大基本元素 优漫动游

平面设计需要美术基础&#xff0c;有美术基础的新人往往能更快完成平面设计岗的转行&#xff0c;在专业培训机构内讲师授课时也会从平面设计的基础——三大基本元素开始。今天就跟大家具体介绍一下平面设计的三大基本元素&#xff0c;让大家知道到底都有哪些。 平面设计的三…

关于c语言中对齐用法,控制精度,字符与字符串解释,(04,02,0004)形式的写法

一&#xff1a;宽度精度 以整形举例&#xff1a; 用法%d 对齐中有宽度和精度参数设置 %(x1).(x2)d 其中x1就是宽度设置(固定长度) x2就是精度设置(保留几位小数) 特殊的不能直接赋值参数&#xff0c;需要间接赋值 例子&#xff1a; #includ…

leetcode做题笔记119. 杨辉三角 II

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 思路一&#xff1a;模拟题意 int* getRow(int rowIndex, int* returnSize){int* ret malloc(sizeof(int)*(rowIndex1));ret[0]…

【React】React学习:从初级到高级(三)

3 状态管理 随着应用不断变大&#xff0c;应该更有意识的去关注应用状态如何组织&#xff0c;以及数据如何在组件之间流动。冗余或重复的状态往往是缺陷的根源。 3.1 用State响应输入 3.1.1 声明式地考虑UI 总体步骤如下&#xff1a; 定位组件中不同的视图状态 确定是什么…

C++零碎记录(四)

6. 深拷贝与浅拷贝 ① 浅拷贝&#xff1a;简单的赋值拷贝操作。 ② 深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作。 ③ 浅拷贝&#xff0c;如下图所示&#xff0c;带来的问题就是堆区的内存重复释放。 ④ 深拷贝&#xff0c;如下图所示&#xff0c;在堆区…

深度学习-4-二维目标检测-YOLOv5源码测试与训练

本文采用的YOLOv5源码是ultralytics发行版3.1 YOLOv5源码测试与训练 1.Anaconda环境配置 1.1安装Anaconda Anaconda 是一个用于科学计算的 Python 发行版&#xff0c;支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 官方网址下载安装包&…

pdf怎么编辑文字?了解一下这几种编辑方法

pdf怎么编辑文字&#xff1f;PDF文件的普及使得它成为了一个重要的文件格式。然而&#xff0c;由于PDF文件的特性&#xff0c;它们不可直接编辑&#xff0c;这就使得PDF文件的修改变得比较麻烦。但是&#xff0c;不用担心&#xff0c;接下来这篇文章就给大家介绍几种编辑pdf文字…

(leetcode1654,广搜)到达家的最少跳跃次数-------------------Java实现

&#xff08;leetcode1654&#xff09;到达家的最少跳跃次数-------------------Java实现 题目表述 某个 bug 的家位于 x 轴上的位置x。帮助他们从位置到达那里0。 bug按照以下规则跳转&#xff1a; 它可以向前&#xff08;向右&#xff09;精确跳跃a位置。 它可以精确地向…

go语言基本操作---三

变量的内存和变量的地址 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go语言对指针的支持介于java语言和C/C语言之间&#xff0c;它即没有想Java语言那样取消了代码对指针的直接操作的能力&#xff0c;也避免了C/C语言中由…

Redis面试题(笔记)

目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 小结 4.缓存-双写一致性 5.缓存-持久性 6.缓存-数据过期策略 7.缓存-数据淘汰策略 数据淘汰策略-使用建议 数据淘汰策略总结 8.redis分布式锁 setnx redission 主从一致性 9.主从复制、主从同步 10.哨兵模式 服务状态监…

最快1个月录用!9月SCI/SSCI/EI刊源表已更新!

2023年9月SCI/SSCI/EI期刊目录更新 2023年9月份刊源表已更新&#xff01;计算机、医学、工程、环境、SSCI均有新增期刊&#xff0c;1区(TOP)&#xff0c;最快1个月录用&#xff0c;好刊版面紧俏&#xff0c;切莫错失机会&#xff01; 01 计算机领域 02 医学与制药领域 03 工…

mysql指令行登录如何添加mysql.sock的配置?(亲测)

在 MySQL 的命令行登录中&#xff0c;你可以使用 --socket 参数来指定 MySQL 的 Unix 套接字文件&#xff08;mysql.sock&#xff09;的位置。以下是使用 --socket 参数进行 MySQL 命令行登录的示例&#xff1a; mysql --socket/path/to/mysql.sock -u username -p 将 /path…

SpringMvc 与 Lombok 碰撞导致 JSON 反序列化失败

SpringMvc 与 Lombok 中 JSON 反序列化失败 错误复现_1 Data public class User{private Long id;private boolean isOk; }RequestMapping public R<User> getUser(RequestBody User user){return R.success(user); }// 前端传参 - {"id": 123456789,"i…

桌面应用小程序,一种创新的跨端开发方案

Qt Group在提及2023年有桌面端应用程序开发热门趋势时&#xff0c;曾经提及三点&#xff1a; 关注用户体验&#xff1a;无论您是为桌面端、移动端&#xff0c;还是为两者一起开发应用程序&#xff0c;有一点是可以确定的&#xff1a;随着市场竞争日益激烈&#xff0c;对产品的期…

Python爬取天气数据并进行分析与预测

随着全球气候的不断变化&#xff0c;对于天气数据的获取、分析和预测显得越来越重要。本文将介绍如何使用Python编写一个简单而强大的天气数据爬虫&#xff0c;并结合相关库实现对历史和当前天气数据进行分析以及未来趋势预测。 1 、数据源选择 选择可靠丰富的公开API或网站作…

YaRN: Efficient Context Window Extension of Large Language Models

本文是LLM系列文章&#xff0c;针对《YaRN: Efficient Context Window Extension of Large Language Models》的翻译。 YaRN&#xff1a;大型语言模型的有效上下文窗口扩展 摘要1 引言2 背景和相关工作3 方法4 实验5 结论 摘要 旋转位置嵌入&#xff08;RoPE&#xff09;已被…