Java 浮點數相加
阿新 • • 發佈:2018-12-14
剛剛遇到個需求,需要對金額求和,上線的時候才知道這時個,這個欄位是個小數。
隨手就改了個Double ,然後,跑下,沒啥問題,直接上線了
然後,就fuck 了
加出一大堆的小數,大概是這樣的
package com.venn.demo; public class DoublePlus { public static void main(String[] args) { double d1 = 0.01; double d2 = 0.01; for (int i=0; i< 10; i++){ d2+= d1; System.out.println(d2); } } }
我以為的輸出是這樣的:
0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11
實際是這樣的:
0.02 0.03 0.04 0.05 0.060000000000000005 0.07 0.08 0.09 0.09999999999999999 0.10999999999999999
一臉懵逼的看完一篇部落格,似懂非懂的:程式設計師必知之浮點數運算原理詳解
結論就是:
很多十進位制小數在轉換成二進位制時,並不能精確表示,只能是近似值。
解決辦法就是使用BIgDecimal
publicstatic void bigDecimalDemo(){ BigDecimal b1 = new BigDecimal("0.01"); BigDecimal b2 = new BigDecimal("0.01"); for (int i=0; i< 10; i++){ b2 = b2.add(b1); System.out.println(b2); } }
輸出如下:
0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11