货币计算为什么使用BigDecimal
参考来源:
【java】为什么要使用BigDecimal类型进行高精度运算 float,double等精度丢失问题 MSDN-为何浮点数可能丢失精度
例子:
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一样;