昨晚看书,书中有这样一句代码:System.out.println(2.00-1.10); //数据结果理论上因为0.90控制台结果理论上因为0.90,但实际输出确实:0.8999999999999999!
我以为是没有声明为DOUBLE类型的原因,就把代码改了下但是结果还是一样:double num_1 = 2.00;
double num_2 = 1.10;
System.out.println(num_1-num_2);
看书中的解释,因为是英译中(我都怀疑是用GOOGLE翻译的),有点晦涩!
所以在这里求牛人!

解决方案 »

  1.   

    其实这个问题我也遇到过 有种简单的方法  可以先乘  去掉小数点  做运算然后再除 可以避免 浮点运算出现这种问题的原因是浮点数值是采用二进制系统表示的,而在系统中无法精确的表示分数1/10。
    需要在计算中不含有任何舍入误差,就应该使用BigDecimal类。
    将一个类标记为strictfp  ,那么这个类中的所有方法都要使用严格的浮点数计算,
    将一个方法标记为strictfp,那么这个方法就会使用严格的浮点数计算,
    public static strictfp void main(String [] args)
      

  2.   


                    double num_1 = 2.00;
    double num_2 = 1.10;
    System.out.println((num_1*1000-num_2*1000)/1000);输出 0.9
      

  3.   

    strictfp这个以前还真不知道,不过感觉没多大用处,要精确计算一般都用BigDecimal了
      

  4.   

    其实书中也提高过用bigdecimal类,我就是想知道原因!还有这个例子是否只是一个特殊情况!
    我们以后在计算的时候是用bigdecimal还是用double呢!或者说转换成整数计算!
      

  5.   

    看下组成原理吧,实际应用的话处理方式double d = Double.parseDouble(v) + 0.1;
    int j = (int) Math.round(d * 10); // 小数点后两位前移,并四舍五入
    double k = (double) j / 10.0; // 还原小数点后两位
      

  6.   

    http://www.guokr.com/article/27173/  请参考如上链接
      

  7.   

    System.out.println(2.00f-1.10f);
    就好了
      

  8.   

    System.out.println(2.00f-1.10f);
    就好了
      

  9.   

    System.out.println(2.00f-1.10f);
    就好了