Java float的精度問題

1、問題描述
進行計算器項目時,對於小數的減法出現了精度問題。之前float的精度問題是有了解的,現在既然在運用中出現了,那就把解決掉吧。當我們輸入2.2 - 2.0時,得到的結果會是0.20000005,這肯定是我們不希望看到的。

2、問題分析
爲什麼會出現這樣的情況了?
具體的我也解釋不清楚,一個可能的原因是和計算機中存儲float類型的方式有關吧。好比我們要去求1/3的結果一樣,只可能得到一個近似值。 
我參考的文章中提到了一個解決方法,通過BigDecimal 類;通過百度後,知道它是用來進行大數字操作的類,而且可以解決浮點數精度的問題。同時還有一個處理整數的BinInteger類。詳細說明讀者可以進一步閱讀:

3、具體的代碼

//之前的計算形式
float a = 2.2f;
float b = 2.0f;
float c = a - b;

//改變成以下的寫法
BigDecimal a1 = new BigDecimal(Float.toString(a));
BigDecimal b1 = new BigDecimal(Float.toString(b));
float c1 = a1.subtract(b1).floatValue();

以下代碼轉載自:http://blog.sina.com.cn/s/blog_6a0cd5e501011soa.html


</pre><pre name="code" class="java">
package org.lxh.demo11.numberdemo;
import java.math.BigDecimal;
class MyMath {
    public static double add(double d1, double d2)
{        // 進行加法運算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.add(b2).doubleValue();
     }
    public static double sub(double d1, double d2)
{        // 進行減法運算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
     }
    public static double mul(double d1, double d2)
{        // 進行乘法運算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.multiply(b2).doubleValue();
     }
    public static double div(double d1,
double d2,int len) {// 進行除法運算
         BigDecimal b1 = new BigDecimal(d1);
         BigDecimal b2 = new BigDecimal(d2);
        return b1.divide(b2,len,BigDecimal.
ROUND_HALF_UP).doubleValue();
     }
    public static double round(double d,
int len) {     // 進行四捨五入
操作
         BigDecimal b1 = new BigDecimal(d);
         BigDecimal b2 = new BigDecimal(1);
        // 任何一個數字除以1都是原數字
        // ROUND_HALF_UP是BigDecimal的一個常量,
表示進行四捨五入的操作
        return b1.divide(b2, len,BigDecimal.
ROUND_HALF_UP).doubleValue();
     }
}
public class BigDecimalDemo01 {
    public static void main(String[] args) {
         System.out.println("加法運算:" +
MyMath.round(MyMath.add(10.345,
3.333), 1));
         System.out.println("乘法運算:" +
MyMath.round(MyMath.mul(10.345,
3.333), 3));
         System.out.println("除法運算:" +
MyMath.div(10.345, 3.333, 3));
         System.out.println("減法運算:" +
MyMath.round(MyMath.sub(10.345,
3.333), 3));
     }
}







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章