bigdecimal 乘法_BigDecimal的浮点数运算能保证精度的原理是什么?

bigdecimal 乘法_BigDecimal的浮点数运算能保证精度的原理是什么?不是所有的十进制数都能转化为有限位二进制数的 1 任意十进制整数可以转化为有限位数的二进制整数 如 123 64 32 16 8 2 1 转化为二进制整数是 2 能分解为以 1 2 n 为单位的十进制小数 可以转化为有限位数的二进制小数 如十进制数 13 16 0 8125 它可以是拆成 13 16 1 2 1 4 1 16 或者直接可以看作是 13 个 1 16 所组成 而 1 2 1 4 1

不是所有的十进制数都能转化为有限位二进制数的。

1、任意十进制整数可以转化为有限位数的二进制整数。

如123=64+32+16+8+2+1,转化为二进制整数是。

2、能分解为以(1/2)^n为单位的十进制小数,可以转化为有限位数的二进制小数。

如十进制数:13/16=0.8125,它可以是拆成:13/16=1/2+1/4+1/16,或者直接可以看作是13个1/16所组成。而1/2,1/4,1/16这些数都是符合(1/2)^n形式的数。

所以13/16转化为4位二进制小数:0.1101。

3、上述情形以外的十进制数都不能转化为有限位数的二进制数。

如十进制小数0.7,转化为二进制小数是:0.10……,循环节是0110。

当第三种情况的小数出现的时候,就会出现计算的精度误差,BigDecimal的原理很简单,就是将小数扩大N倍,转成整数后再进行计算,同时结合指数,得出没有精度损失的结果。

我们看一下BigDecimal构造原理

部分内容转载自:

[java基础原理] BigDecimal​www.cnblogs.com

f31c4f8b79175b5f5d8759587d8d1769.png
package 

2.对象简化示例

2.1 以long型的intCompact和scale来存储精确的值。

2.2 包含stringCache,因此创建BigDecimal对象时,优先转换成String类型,比如double转BigDecimal也是先double转成String,再String转成BigDecimal.

7804408aabe7109e47a455b19c7ba824.png

87f3988a15dfd111f33c57266b241ed7.png

272a1f42f8796983d1ab1dec01623b62.png

3.加减乘除的实现

加法:long类型 +

package 

/ 

减法:转成加法,加负数

乘法: long类型 *, 多些进位超界判断

除法: long类型 /, 多些小数位数保留判断

4.BigDecimal能更精确表示带小数点的数值,因为采用了long intCompact和int scale来表示数值,而不是浮点型的科学计数法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216709.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:15
下一篇 2026年3月18日 上午11:15


相关推荐

  • L2-014 列车调度 (25 分)详解

    L2-014 列车调度 (25 分)详解火车站的列车调度铁轨的结构如下图所示。两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?输入格式:输入第一行给出一个整数N…

    2022年7月26日
    9
  • idea中解析不了Longblob类型

    idea中解析不了Longblob类型昨天有人问我Longblob在idea中解析不了,##标题下面是我的讲解你数据库是longblob,java里就用byte接收功能快捷键撤销:Ctrl/Command+Z重做:Ctrl/Command+Y加粗:Ctrl/Command+B斜体:Ctrl/Command+I标题:Ctrl/Command+Shift+H无序列表:Ctrl/Command+Shift+U有序列表:Ctrl/Command+Shif

    2022年4月5日
    53
  • mybatishelperpro激活码_在线激活

    (mybatishelperpro激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2K…

    2022年4月1日
    281
  • elasticsearch面试必考(亲身经历的问题)

    作者:手留余香|转自:Java架构沉思录|原文面试题es写入数据的工作原理是什么啊?es查询数据的工作原理是什么啊?底层的lucene介绍一下呗?倒排索引了解吗?面试官心理分析问这个,其实面试官就是要看看你了解不了解es的一些基本原理,因为用es无非就是写入数据,搜索数据。你要是不明白你发起一个写入和搜索请求的时候,es在干什么,…

    2022年4月4日
    158
  • docker 安装 shipyard(中文版) 集群管理平台

    docker 安装 shipyard(中文版) 集群管理平台1 安装 shipyard 下载依赖镜像 dockerpullre etcddockerpu docker proxydockerp shipyard 将原先脚本修改为中文脚本 wgethttps raw githubuse

    2026年3月18日
    2
  • iOS8定位问题

    iOS8定位问题

    2021年9月9日
    49

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号