一个奇怪的问题: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