项目采坑日志——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日志并进行多维度分析。
目录
相关文章
|
10天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
118 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
14天前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
14天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
32 2
|
25天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
31 2
|
10天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
1月前
|
Java 编译器
Java“返回类型为 void 的方法不能返回一个值”解决
在 Java 中,如果一个方法的返回类型被声明为 void,那么该方法不应该包含返回值的语句。如果尝试从这样的方法中返回一个值,编译器将报错。解决办法是移除返回值语句或更改方法的返回类型。
|
1月前
|
设计模式 Java
Java“不能转换的类型”解决
在Java编程中,“不能转换的类型”错误通常出现在尝试将一个对象强制转换为不兼容的类型时。解决此问题的方法包括确保类型间存在继承关系、使用泛型或适当的设计模式来避免不安全的类型转换。
|
1月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
1月前
|
安全 Java
Java“不兼容类型” 错误怎么查找解决
在 Java 中遇到“不兼容类型”错误时,首先理解错误信息,它表明试图将一种类型赋给不兼容的类型。检查代码中类型不匹配的赋值、方法调用参数类型不匹配、表达式类型不兼容及泛型类型不匹配等问题。解决方法包括进行类型转换、修改代码逻辑、检查方法参数和返回类型以及处理泛型类型不匹配。通过这些步骤,可以有效解决“不兼容类型”错误,确保代码类型兼容性良好。
|
1月前
|
Java 程序员 编译器
Java中的异常类型
Java中的异常类型
23 3