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原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring中Spel表达式和el表达式的区别

    详解Spring中Spel表达式和el表达式的区别

    在 Java 开发中,表达式语言是一种强大的工具,而SpEL 表达式与EL 表达式是我们常常遇到两种表达式语言,下面我们就来看看它们的具体使用与区别吧
    2023-07-07
  • Spring boot集成swagger2生成接口文档的全过程

    Spring boot集成swagger2生成接口文档的全过程

    这篇文章主要给大家介绍了关于Spring boot集成swagger2生成接口文档的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java正则之贪婪匹配、惰性匹配

    Java正则之贪婪匹配、惰性匹配

    这篇文章主要介绍了Java正则之贪婪匹配、惰性匹配的相关资料,需要的朋友可以参考下
    2015-03-03
  • spring boot使用sonarqube来检查技术债务

    spring boot使用sonarqube来检查技术债务

    今天小编就为大家分享一篇关于spring boot使用sonarqube来检查技术债务,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • JCommander解析命令行参数使用详解

    JCommander解析命令行参数使用详解

    这篇文章主要为大家介绍了JCommander解析命令行参数使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • MyBatis实现简单的数据表分月存储

    MyBatis实现简单的数据表分月存储

    本文主要介绍了MyBatis实现简单的数据表分月存储,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 如何使用Spring-Test对Spring框架进行单元测试

    如何使用Spring-Test对Spring框架进行单元测试

    这篇文章主要介绍了如何使用Spring-Test对Spring框架进行单元测试,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java使用颜色选择器示例分享

    java使用颜色选择器示例分享

    这篇文章主要介绍了java使用颜色选择器示例,需要的朋友可以参考下
    2014-03-03
  • 如何在Redis中实现分页排序查询过程解析

    如何在Redis中实现分页排序查询过程解析

    这篇文章主要介绍了如何在Redis中实现分页排序查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 总结Bean的三种自定义初始化和销毁方法

    总结Bean的三种自定义初始化和销毁方法

    这篇文章主要介绍了Bean的三种自定义初始化和销毁方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论