System.out.println(2.1-1.1);
System.out.println(2.0-1.1);
输出结果:
1.0
0.8999999999999999为何会这样,请高手解释!

解决方案 »

  1.   

    double不能直接参与精确计算。
    你用BigDecimal类来包装一下。
      

  2.   

    double精度比较高,计算后可能ROUND取其需要的倍数
      

  3.   


    import java.math.BigDecimal;
    public class TestBigDecimal {
        public static void main(String[] args)
        {
            System.out.println(2.1 - 1.1);
            System.out.println(2.0 - 1.1);
            BigDecimal bigDecimal = new BigDecimal(2.1 - 1.1);
            System.out.println(bigDecimal);
            BigDecimal bigDecimal1 = new BigDecimal(2.0 - 1.1);
            System.out.println(bigDecimal1);
        }
    }
    结果:
    1.0
    0.8999999999999999
    1
    0.899999999999999911182158029987476766109466552734375从结果来看BigDecimal bigDecimal1 = new BigDecimal(2.0 - 1.1);
    还是没有精确的
      

  4.   

            BigDecimal bigDecimal1 = new BigDecimal("2.0"); 
    BigDecimal bigDecimal2 = new BigDecimal("1.1");
    //BigDecimal bigDecimal2 = BigDecimal.valueOf(1.1);
            System.out.println(bigDecimal1.add(bigDecimal2.negate())); 
    System.out.println(new BigDecimal(1.1)); 
    从红色这句,你应该可以看出点东西
    new BigDecimal(double a) a 存进去的时候已经损失了精度,所以使用时用以下两种方式
    1 . new BigDecimal("1.1")
    2 . BigDecimal.valueOf(1.1)
      

  5.   

    顺便说一下:这是我从"疯狂JAVA讲义"书上看的...这是一本不错的书,但是我从不懂JAVA,只学过c,那本书学了3个多月,我就找到工作了...或许有人要骂我是书托,那就看你们的判断力了...
      

  6.   

                    double不能用于精度运算
                      BigDecimal 提供适用于货币计算和类似计算的任意精度的有符号十进制数字
                      double d1 = 2.0;
    double d2 = 1.1;
    BigDecimal bd1 = new BigDecimal(d1+"");
    BigDecimal bd2 = new BigDecimal(d2+"");
    System.out.println(
      bd1.subtract(bd2).doubleValue());
      

  7.   

    重发下,排版有点问题。
    double d1 = 2.0; 
    double d2 = 1.1; 
    BigDecimal bd1 = new BigDecimal(d1+""); 
    BigDecimal bd2 = new BigDecimal(d2+""); 
    System.out.println( 
      bd1.subtract(bd2).doubleValue());
      

  8.   

    补充下:
    System.out.println(2.1-1.1);
    System.out.println(2.0-1.1); 
    System.out.println(2.2-1.1);
    System.out.println(2.2-1.3);结果:
    1.0
    0.8999999999999999
    1.1
    0.9000000000000001
    问题:同样是double运算,为何1和3行输出正常,2和4行却是这样的。
      

  9.   

    double类型的计算本身就不是精确值,而是近似值!至于为什么会那样我也不太清楚,估计要问问sun了~呵呵!总之记住就行了!没必要研究那么深!想得精确值就象上面高手说的那样,BigDecimal解决!
      

  10.   

    double本身就是近似值,有BigDecimal就行
    import java.math.BigDecimal;
    public class TestNumber {
    public static void main(String[] args) {
    double d1 = 2.0;
    double d2 = 1.1;
    BigDecimal bd1 = new BigDecimal(d1+"");
    BigDecimal bd2 = new BigDecimal(d2+"");
    System.out.println(
      bd1.subtract(bd2).doubleValue());


    }}
      

  11.   

    因为double是近似值,所以有时候准确,有时候就不准了。
      

  12.   

    double也是用IEEE制定的浮点数表示法,有些小数不能精确表示,比如0.1
    具体可以看这篇文章
    http://blog.sina.com.cn/s/blog_5a3640220100c5ro.html