http://hi.baidu.com/jjcc2001/blog/item/ec32bbca48fac740f21fe79e.html
解決方法:寫一個Arith類:
http://www.linuxidc.com/Linux/2011-06/37232.htm
首先我們先用一般的情況進行下double類型的計算。
- System.out.println(1.0-0.41);
得到的值是0.5900000000000001,這個是不精確的。
爲了解決這個問題,Java爲我們提供了一個叫BigDecimal的類。
所以我們用下面的方法計算。
- BigDecimal bd1 = new BigDecimal(1.0);
- BigDecimal bd2 = new BigDecimal(0.41);
- System.out.println(
- bd1.subtract(bd2).doubleValue());
我們又看到,這個值和上面得到的是一樣的。也是不精確的,也許這就是Java的一個BUG吧。
但是我們換一種另外的方法解決。注意看註釋。
- BigDecimal bd3 = new BigDecimal(""+1.0);
- BigDecimal bd4 = new BigDecimal(""+0.41);
- System.out.println(
- bd3.subtract(bd4).doubleValue());
但是非常鬱悶的是,這樣計算照樣會出問題。我們繼續來看下面的除法例子,會報錯。
- BigDecimal bd5 = new BigDecimal("2.0");
- BigDecimal bd6 = new BigDecimal("3.0");
- System.out.println(
- bd5.divide(bd6).doubleValue());
這是因爲0.666666是個無限小數,虛擬機不能表示了。所以我們需要限制位數,並且採用四捨五入的方法。
所以下面就是終極解決方法了。
- BigDecimal bd5 = new BigDecimal("2.0");
- BigDecimal bd6 = new BigDecimal("3.0");
- System.out.println(
- bd5.divide(bd6,10,BigDecimal.ROUND_HALF_UP).doubleValue());