Java中的BigDecimal原理详解

 更新时间:2023年09月11日 10:50:14   作者:feiyingHiei  
这篇文章主要介绍了Java中的BigDecimal原理详解,对于日常开发过程中出现小数的问题,通常都是使用float或者double类型来处理,在java中float占用四个字节, double类型占用8个字节,需要的朋友可以参考下

BigDecimal原理

一、浮点数的精度问题

对于日常开发过程中出现小数的问题,通常都是使用float或者double类型来处理,在java中float占用四个字节, double类型占用8个字节,简单的从double类型来说,计算机中存储的格式为

在这里插入图片描述

位数功能
63符号位
62 - 52指数位
51-0尾数

一个浮点数的数值  d=±1.f×2E−127

比如一个浮点数1.5,转换成二进制就是1.1,套用上述的公式  f=1, fraction=127,转换成二进制数为0 00111111111 1000000000000000000000000000000000000000000000000

通过代码的方式来验证一下

        System.out.println(Long.toBinaryString(Double.doubleToLongBits(1.5d)));

输出的结果为

11111111111000000000000000000000000000000000000000000000000000

和我们的计算结果相同。看到这里,很容易就发现,浮点数是依赖2的负数次幂求和来表示十进制数的,那么就必然存在着精度的问题,比如,十进制中的0,通过上述公式计算是永远无法获得的。在表示0的时候, f = 0 f=0 f=0, e x p o n e n t = 0 exponent=0 exponent=0, 那么 d = 1.0 × 2 − 127 d=1.0 \times 2^{-127} d=1.0×2−127, 所以会发现使用这种方式表示浮点数是有精度问题的,在精度要求不高的场景下,我们可以使用原生的浮点数来处理,但是当我们在对精度有很高要求的场景时,使用dobule就无法满足我们的需求了。

BigDecimal

在Java中,jdk为我们提供了bigDecimal,bigDecimal解决了浮点数的精度问题,下面就看一下BigDecimal是如何解决这个问题的,废话不多说,直接上源码

public class BigDecimal extends Number implements Comparable<BigDecimal> {
    private final BigInteger intVal;
	private final int scale;
    private transient int precision;
    private transient String stringCache;
}

主要的存储方式是通过intVal和scale来表示,d=intVal×10−scale

所以当需要表示1.1的时候,只需要 intVal=11 然后 scale=1即可。这种情况下就不会丢失精度了。

到此这篇关于Java中的BigDecimal原理详解的文章就介绍到这了,更多相关BigDecimal原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在SpringBoot中定义和读取自定义配置的方法步骤

    在SpringBoot中定义和读取自定义配置的方法步骤

    在Spring Boot中定义和读取自定义配置是日常开发中常见的需求,它允许我们以灵活的方式管理应用的配置信息,无论是通过外部配置文件还是通过环境变量,本文是一个详细的步骤说明,包括示例代码,需要的朋友可以参考下
    2024-10-10
  • Spring Boot详解五种实现跨域的方式

    Spring Boot详解五种实现跨域的方式

    跨域指的是浏览器不能执⾏其他⽹站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制,这篇文章主要介绍了springboot实现跨域的5种方式,需要的朋友可以参考下
    2022-06-06
  • 详解Java多态对象的类型转换与动态绑定

    详解Java多态对象的类型转换与动态绑定

    这篇文章主要介绍了详解Java多态对象的类型转换与动态绑定,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • spring boot日志管理配置

    spring boot日志管理配置

    这篇文章主要介绍了spring boot日志管理配置的相关资料,需要的朋友可以参考下
    2017-04-04
  • Java中常见的数据验证注解总结大全

    Java中常见的数据验证注解总结大全

    在Java开发中数据校验是确保应用程序的数据完整性和一致性的重要步骤,这篇文章主要介绍了Java中常见的数据验证注解的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • Spring中接口FactoryBean作用及说明

    Spring中接口FactoryBean作用及说明

    这篇文章主要介绍了Spring中接口FactoryBean作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-05-05
  • JetBrains IntelliJ IDEA 2020安装与使用教程详解

    JetBrains IntelliJ IDEA 2020安装与使用教程详解

    这篇文章主要介绍了JetBrains IntelliJ IDEA 2020安装与使用教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解

    JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解

    这篇文章主要介绍了JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java并发编程之Fork/Join框架的理解

    Java并发编程之Fork/Join框架的理解

    今天带大家学习Java并发编程的相关知识,文中对Fork/Join框架作了非常详细的介绍,对正在学习有关知识的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06

最新评论