float fval = 8.9;
int   amount = 100;
fval*amount为什么不是890,而变成了889.9990?

解决方案 »

  1.   

    http://blog.csdn.net/tinasalangane/article/details/7248699 关于精度丢失这里面讲的比较详细 你看一看
      

  2.   

    float双精度以及double都是会有丢失的
    具体的涉及到补码和反码什么的,反正我是感觉挺复杂的。。
    不是高精度的就少用,尽量选择适合的类型就能避免这种问题
      

  3.   

    float f = 8.9f;
    int i = 100;
    BigDecimal b1 = new BigDecimal(f);
    BigDecimal b2 = new BigDecimal(i);
    System.out.println(i * f);
    System.out.println(f * i);
    System.out.println(b1.multiply(b2).intValue());
    System.out.println(b1.multiply(b2).setScale(0, BigDecimal.ROUND_HALF_UP));
    System.out.println(b1.multiply(b2).setScale(1, BigDecimal.ROUND_HALF_UP));
    System.out.println(b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP));
    输出结果:
    889.99994
    889.99994
    889
    890
    890.0
    890.00
      

  4.   

    这里有详细介绍。  http://www.ibm.com/developerworks/cn/java/j-jtp0114/
    “浮点运算很少是精确的。虽然一些数字(譬如 0.5 )可以精确地表示为二进制(底数 2)小数(因为 0.5 等于 2 -1),但其它一些数字(譬如 0.1 )就不能精确的表示。因此,浮点运算可能导致舍入误差,产生的结果接近 ― 但不等于 ― 您可能希望的结果。”
    可以用BIGDECIMAL 但是注意“对于 BigDecimal ,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDecimal(double) 构造函数,因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。”public class TestClass {
    public static void main(String[] args) throws Exception {
    BigDecimal f = new BigDecimal("8.9");
    BigDecimal a = new BigDecimal(100);
    System.out.println(f.multiply(a));
    }
    }
      

  5.   

    都转成统一类型试试,或者使用Bigdecimal
      

  6.   

    使用double和float类型保存数据本来就是不精确的,如果需要精确计算使用BigDecimal代替
      

  7.   

    double,float型的加减乘除最好都用Bigdecimal对象来操作.