项目采坑日志——Java浮点类型数据进行加减运算出现精度丢失问题

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 项目采坑日志——Java浮点类型数据进行加减运算出现精度丢失问题

Java浮点类型数据进行加减运算出现精度丢失问题

现象

在项目开发过程中,有一个需求是计算章节的总时长,由于是一个树形接口每一个叶子节点上都需要进行其下所有子节点的时长累加。最后结果出现了,进度丢失的问题,在系统前端界面设置了数据的入参精读为小数点后一位,但是在后端返回的数据却出现了丢失精度的问题。如图:


解决效果


问题分析

出现这样的问题,最终通过bug排查,最后在发现问题出现在后端,后端通过使用浮点型(double、float)数据进行的时长计算。那么问题就定位到了,使用浮点型数据进行加减运算很可能出现问题。通过查阅资料发现,的确使用浮点型数据进行运算会出现精度丢失的问题。

出现问题的原因

由于计算机进行运算例如加减运算都是通过二进制数进行运算。在进行运算的时候,都需要将数据转换成计算机能够进行运算的二进制数据,具体如何转换的过程就不必细说了,博主我也暂时不知道。目前的现象是浮点型数据在转换为二进度再由二进度转换为十进制的过程中是存在一些问题的。

解决办法

解决思路:

1.通过使用JDK自带的BigDecimal类进行浮点类型数据的运算。

2.将浮点数计算出的结果进行四舍五入,来获取到真实数据。

具体实现代码:

我这儿选中的是JDK自带的BigDecimal类进行浮点型数据运算,封装了一个专门用于计算float类型数据相加的方法

public static Float add(Float valueA, Float valueB) {
    BigDecimal numberA = new BigDecimal(Float.toString(valueA));
    BigDecimal numberB = new BigDecimal(Float.toString(valueB));
    return numberA.add(numberB).floatValue();
}

最后的实现效果:

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2天前
|
算法 搜索推荐 Java
Java插入排序:优雅整理数据的艺术
Java插入排序:优雅整理数据的艺术
|
1天前
|
数据采集 监控 前端开发
JAVA公立医院绩效考核管理系统源码-对接HIS数据
在医院的工作和管理上,院领导需要对院内工作人员的工作情况进行了解、评价和监控。 下面将对医院绩效管理系统的HIS数据流程加以阐述。
8 1
JAVA公立医院绩效考核管理系统源码-对接HIS数据
|
2天前
|
监控 Java 索引
如何在Java中实现有效的日志管理
如何在Java中实现有效的日志管理
|
2天前
|
Java
使用kafka-clients操作数据(java)
使用kafka-clients操作数据(java)
13 6
|
17小时前
|
监控 Java
优化Java应用的日志记录方法
优化Java应用的日志记录方法
|
22小时前
|
存储 安全 Java
JAVA泛型:类型安全,从编译时开始!
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时实现类型安全的集合。它通过类型参数增强代码灵活性和重用性,减少错误。示例展示了泛型列表`List<Integer>`和`List<String>`如何确保元素类型正确,防止编译时类型不符。泛型提升了代码的类型安全、可读性和维护性。
|
22小时前
|
安全 Java 编译器
JAVA泛型,编译时类型安全的“秘密武器”
【6月更文挑战第28天】Java泛型是JDK 5引入的特性,用于在编译时增强类型安全和代码复用。它允许类、接口和方法使用类型参数,确保运行时类型匹配,减少了类型转换错误。例如,泛型方法`<T> void printArray(T[] array)`能接受任何类型数组,编译器会检查类型一致性。此外,泛型提升了代码的可读性、可维护性和与容器类的配合效率,优化整体软件质量。
|
1天前
|
Java Apache
学习Java中的日志系统设计与优化
学习Java中的日志系统设计与优化
|
1天前
|
安全 Java 开发者
谁说 JAVA 不懂爱?泛型来给你满满的类型安全感!
【6月更文挑战第28天】Java泛型,编程中的类型守护者,提供编译期类型检查,增强代码安全与可读。如`GenericBox<T>`示例,实现类型参数化,避免转换错误。泛型方法如`printArray<T>`,灵活处理不同数据。它简化代码,消除潜在错误,赋予开发者类型保障的爱,让编程之旅更安心。Java的泛型,是对其语言之爱的深刻表达。
|
2天前
|
XML Java 定位技术
详尽分享经纬坐标(BLH)数据创建.kml文件小工具设计Java版
详尽分享经纬坐标(BLH)数据创建.kml文件小工具设计Java版