日期:2014-05-20  浏览次数:20666 次

一个奇怪的问题:3个double类型相加出现多余小数位
可能有人会说返回了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会出现多余小数位,其他情况不会。 
但却找不到什么规律,不知道是怎么回事,请各位帮忙看看。

------解决方案--------------------
double all = new BigDecimal(f.getF1()).add(new BigDecimal(f.getF2()).add(new BigDecimal(f.getF3()));
精度问题
------解决方案--------------------
并不是所有的小数都可以用二进制浮点数来精确表示的
二进制浮点不可能将0.1——或者10的其它任何次负幂——精确表示为一个长度有限的二进制小数 (看下计算机组成原理中的浮点数的表示方法,好象有不同的标准)

解决的方法可以用BigDecimal类,该类位于java.math包中,它的用法其实挺简单的,不妨自己去查下API