货币计算为什么使用BigDecimal

参考来源:

【java】为什么要使用BigDecimal类型进行高精度运算     float,double等精度丢失问题     MSDN-为何浮点数可能丢失精度       

例子:

货币计算为什么使用BigDecimal

BigDecimal的使用是用来解决浮点运算可能精度丢失的问题,那为什么浮点数可能会丢失精度?

首先考虑浮点数的二进制表示,如 :

小数 0.125

0.125 * 2 = 0.25

0

0.25 * 2 = 0.5

0

0.5 * 2 = 1

1

算法是 *2 直到没有小数为止  ,得到0.125 二进制表示为0 . 0 0 1 

 

小数 0.9

0.9 * 2 = 1.8 

取整数部分 1

0.8(1.8的小数部分) * 2 = 1.6   

1

0.6 * 2 = 1.2  

1

0.2 * 2 = 0.4  

0

0.4 * 2 = 0.8  

0

0.8 * 2=1.6

1

0.6 * 2 =1.2  

0

…..

….

从上至下:1 1 1 0 0 1 0 ......

计算过程无限循环,乘以2永远不可能消灭小数部分,这就证明,小数的二进制有时并不能精确表示

这就如同十进制不能表示1/3一样;