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 Boot 文件上传与下载的示例代码

    Spring Boot 文件上传与下载的示例代码

    这篇文章主要介绍了Spring Boot 文件上传与下载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • MyBatis3源码解析之如何获取数据源详解

    MyBatis3源码解析之如何获取数据源详解

    用myBatis3与spring整合的时候,我们可以通过多种方式获取数据源,下面这篇文章主要给大家介绍了关于MyBatis3源码解析之如何获取数据源的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • IDEA 2021.1 的 Win 和 Mac 快捷键大全

    IDEA 2021.1 的 Win 和 Mac 快捷键大全

    这篇文章主要介绍了IDEA 2021.1 的 Win 和 Mac 快捷键大全,本文是小编给大家精心收藏的,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring boot中使用ElasticSearch的方法详解

    Spring boot中使用ElasticSearch的方法详解

    这篇文章主要给大家介绍了关于Spring boot中使用ElasticSearch的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 详谈Java中instanceof和isInstance的区别

    详谈Java中instanceof和isInstance的区别

    下面小编就为大家带来一篇详谈Java中instanceof和isInstance的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • java中字符串替换常用的4种方法

    java中字符串替换常用的4种方法

    在Java中String类提供了许多方便的方法来处理字符串,下面这篇文章主要给大家介绍了关于java中字符串替换常用的4种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 深度剖析Java中的内存原型及工作原理

    深度剖析Java中的内存原型及工作原理

    这篇文章主要介绍了深度剖析Java中的内存原型及工作原理,本文讲解了java虚拟机内存原型、常量池、Java内存分配中的栈、Java内存分配中的堆等内容,需要的朋友可以参考下
    2015-01-01
  • Java实现的简单画图板示例

    Java实现的简单画图板示例

    这篇文章主要介绍了Java实现的简单画图板,涉及java使用swing组件进行图形绘制相关操作技巧,需要的朋友可以参考下
    2018-08-08
  • El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式

    El表达式使用问题javax.el.ELException:Failed to parse the expression

    今天小编就为大家分享一篇关于Jsp El表达式使用问题javax.el.ELException:Failed to parse the expression的解决方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • spring boot metrics监控指标使用教程

    spring boot metrics监控指标使用教程

    这篇文章主要为大家介绍了针对应用监控指标暴露spring boot metrics监控指标的使用教程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02

最新评论