可能有人会说返回了double,自然会出现精度问题,用decimal转换,但我发现相加时是否出现多余小数位居然和输入的数字有关!先看代码: 
代码
public class Test{   
    double f1,f2,f3;   
    public static void main(String[] args) {   
        Testf = new Test();   
        f.setF1(12.49);   
        f.setF2(14.23);   
        f.setF3(0.95); //注意这几个数字   
        double all = f.getF1()+f.getF2()+f.getF3();   
        System.out.println(all);   
    }   
    public double getF1() {   
        return f1;   
    }   
    public void setF1(double f1) {   
        this.f1 = f1;   
    }   
    public double getF2() {   
        return f2;   
    }   
    public void setF2(double f2) {   
        this.f2 = f2;   
    }   
    public double getF3() {   
        return f3;   
    }   
    public void setF3(double f3) {   
        this.f3 = f3;   
    }   
}   
上面计算3个double数相加,我在改变最后一个变量f3的值时,发现有时候会出现多余小数位,有时候又不会,例如f3=0.95的时候,结果是27.669999999999998;但f3=0.85时,结果就是27.57。 
我分别尝试了f3从0.15 ~ 0.95,发现在.15/.45/.65/.95会出现多余小数位,其他情况不会。 
但却找不到什么规律,不知道是怎么回事,请各位帮忙看看。

解决方案 »

  1.   

     double all = new BigDecimal(f.getF1()).add(new BigDecimal(f.getF2()).add(new BigDecimal(f.getF3()));
    精度问题    
      

  2.   

    并不是所有的小数都可以用二进制浮点数来精确表示的
    二进制浮点不可能将0.1——或者10的其它任何次负幂——精确表示为一个长度有限的二进制小数 (看下计算机组成原理中的浮点数的表示方法,好象有不同的标准)解决的方法可以用BigDecimal类,该类位于java.math包中,它的用法其实挺简单的,不妨自己去查下API