一般貨幣計算的時候都要用到BigDecimal類,為什么一般不適用float或者double呢?
先看一下浮點數的二進制表示:
小數 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一樣;
貨幣類計算要求精度較高,非常大量的,很小的精度誤差也會積少成多變成大誤差,所以需要用到BigDecimal。
參考:https://blog.csdn.net/tfstone/article/details/81392540