不是所有的十进制数都能转化为有限位二进制数的。
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基础原理] BigDecimalwww.cnblogs.com
package
2.对象简化示例
2.1 以long型的intCompact和scale来存储精确的值。
2.2 包含stringCache,因此创建BigDecimal对象时,优先转换成String类型,比如double转BigDecimal也是先double转成String,再String转成BigDecimal.
3.加减乘除的实现
加法:long类型 +
package
/
减法:转成加法,加负数
乘法: long类型 *, 多些进位超界判断
除法: long类型 /, 多些小数位数保留判断
4.BigDecimal能更精确表示带小数点的数值,因为采用了long intCompact和int scale来表示数值,而不是浮点型的科学计数法。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216709.html原文链接:https://javaforall.net
