谁能解释这是为什么

public class FloatError {

public static void main(String[] args) {
    double a,b,c;
    a=32668.5536;
    b=1.1;
    c=a+b;
    System.out.println(c);

}

}



输出:
32669.653599999998
问题补充:

package forums.sun;

import java.math.BigDecimal;

public class FloatError {

public static void main(String[] args) {
    BigDecimal a,b,c;
    a=new BigDecimal(32668.5536);
    b=new BigDecimal(1.1);
    c=a.add(b);
    System.out.println(c);
}

}



我用BigDecimal了还是这样?能解释是为什吗?

你应该指定精度:
BigDecimal a,b,c;

a=new BigDecimal(32668.5536,MathContext.DECIMAL64);

b=new BigDecimal(1.1,MathContext.DECIMAL32);

c=a.add(b);

System.out.println(c);

如果不想指定可以用String
BigDecimal a,b,c;

a=new BigDecimal("32668.5536");

b=new BigDecimal("1.1");

c=a.add(b);

System.out.println(c);

对啊。为什么呢,两个数都是double类型啊,应该不存在精度问题啊。

a=32668.5536;

b=32668.5536;
System.out.println(c);
这样输出就:65337.1072
???

java的double和float本身就是有精度问题,要想精确,就用BigDecimal吧!

    BigDecimal a,b,c;  
    a=new BigDecimal("32668.5536");  
    b=new BigDecimal("1.1");  
    c=a.add(b);  
    System.out.println(c);

使用字符串转换成BigDecimal 的方法比较好,建议使用。

浮点类型数据不适合在不容许舍入误差的金融计算领域使用。比如,
命令System.out.println(2.0-1.1)将会打印0.8999999999999999
而不是希望的0.9.这种舍入误差的产生的原因是因为浮点数实际上是用二进制系统表示的。而 分数1/10在二进制系统中没有精确的表示。

不是来骗答案然后不给分吧?