Java中double類型計算不精確的解決辦法(BigDecimal)

 
2008-10-06 10:33

http://hi.baidu.com/jjcc2001/blog/item/ec32bbca48fac740f21fe79e.html

解決方法:寫一個Arith類:

http://www.linuxidc.com/Linux/2011-06/37232.htm

首先我們先用一般的情況進行下double類型的計算。

  1. System.out.println(1.0-0.41);

得到的值是0.5900000000000001,這個是不精確的。
爲了解決這個問題,Java爲我們提供了一個叫BigDecimal的類。
所以我們用下面的方法計算。

  1. BigDecimal bd1 = new BigDecimal(1.0);
  2. BigDecimal bd2 = new BigDecimal(0.41);
  3. System.out.println(
  4. bd1.subtract(bd2).doubleValue());

我們又看到,這個值和上面得到的是一樣的。也是不精確的,也許這就是Java的一個BUG吧。
但是我們換一種另外的方法解決。注意看註釋。

  1. BigDecimal bd3 = new BigDecimal(""+1.0); //必須使用String做參數纔可以精確運算
  2. BigDecimal bd4 = new BigDecimal(""+0.41);
  3. System.out.println(
  4. bd3.subtract(bd4).doubleValue());

但是非常鬱悶的是,這樣計算照樣會出問題。我們繼續來看下面的除法例子,會報錯。

  1. BigDecimal bd5 = new BigDecimal("2.0");
  2. BigDecimal bd6 = new BigDecimal("3.0");
  3. System.out.println(
  4. bd5.divide(bd6).doubleValue());

這是因爲0.666666是個無限小數,虛擬機不能表示了。所以我們需要限制位數,並且採用四捨五入的方法。
所以下面就是終極解決方法了。

  1. BigDecimal bd5 = new BigDecimal("2.0");
  2. BigDecimal bd6 = new BigDecimal("3.0");
  3. System.out.println(
  4. bd5.divide(bd6,10,BigDecimal.ROUND_HALF_UP).doubleValue());
發佈了35 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章