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

bigdecimal 乘法_BigDecimal的浮点数运算能保证精度的原理是什么?不是所有的十进制数都能转化为有限位二进制数的。1、任意十进制整数可以转化为有限位数的二进制整数。如123=64+32+16+8+2+1,转化为二进制整数是1111011。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,转化为二进制整数是1111011。

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.1011001100110……,循环节是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来表示数值,而不是浮点型的科学计数法。

今天的文章bigdecimal 乘法_BigDecimal的浮点数运算能保证精度的原理是什么?分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/6706.html

(0)
编程小号编程小号

相关推荐

发表回复

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