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

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

时间:2022-12-19 14:09:17浏览次数:117  
标签:Java 运算 采坑 Float 问题 浮点 数据 BigDecimal


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

  • ​​现象​​
  • ​​解决效果​​
  • ​​问题分析​​
  • ​​出现问题的原因​​
  • ​​解决办法​​
  • ​​解决思路:​​
  • ​​具体实现代码:​​
  • ​​最后的实现效果:​​

现象

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

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

解决效果

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

问题分析

出现这样的问题,最终通过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();

}

最后的实现效果:

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


标签:Java,运算,采坑,Float,问题,浮点,数据,BigDecimal
From: https://blog.51cto.com/u_15916106/5952235

相关文章

  • lightdb extra_float_digits--控制浮点数精度
    lightdb中extra_float_digits参数可以用来控制浮点数输出的精度,其采用原生c语言的float4/float8实现,可能我们在平时使用中并不太会留意,但是显示的时候会有一些问题。建一......
  • 死磕Java多线程之线程池的基本使用与核心原理
    Java多线程之线程池一、线程池的自我介绍1.线程池的重要性(为什么使用线程池)线程池可以应对突然大爆发量的访问,通过有限个固定线程为大量的操作服务,减少创建和销毁线程所需......
  • java中常用的一些类型强制转换
    一.String->其他在​​Java​​项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。常用的方法有Object.toString()......
  • Java关键字(一)——instanceof
    目录​​1、obj必须为引用类型,不能是基本类型​​​​2、obj为null​​​​3、obj为class类的实例对象​​​​4、obj为class接口的实现类​​​​5、obj为class......
  • IDEA中编译报错【java: 程序包lombok不存在】
    一、lombok问题没有正确引入lombok检查是否在pom中引入lombok依赖<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>......
  • Java锁升级
    锁升级整体对象头MarkWord结构如下:1.自旋锁与自适应自旋1.1自旋锁如果物理机器有一个以上的处理器或者处理器核心,能让两个或以上的线程同时并行执行,我们就可以让......
  • 连号区间数【第四届蓝桥杯省赛C++B组,第四届蓝桥杯省赛JAVAB组】
    连号区间数小明这些天一直在思考这样一个奇怪而有趣的问题:在\(1∼N\)的某个排列中有多少个连号区间呢?这里所说的连号区间的定义是:如果区间\([L,R]\)里的所有元素(即......
  • java核心技术学习笔记——synchronized底层如何实现?什么是锁的升级、降级?
    在Java6之前,Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。现代的(Oracle)JDK中,VM对此进......
  • javaMail笔记
    JavaMail        javaMail是提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套表中开发类库,支持常用的邮件协议,如SMTP,POO3,IMAP,开发人员使用javaMa......
  • 【java】(二) SpringBoot 源码解析——run启动加载过程——准备环境
    1.前言深入学习springboot笔记系列,可能会有错误还请指正,互相勉励,互相学习。上一章讲了SpringApplicaiton是如何初始化的,本章讲解后续的run方法的启动过程。本章涉及......