float和double采用科学计数法保存,不能保证100%精确,即便简单的+、-运算也保证不了。
如果想要做到100%精确,还是用java.math.BigDecimal吧。

解决方案 »

  1.   

    用java.math.BigDecimal,具体怎样用,能不能给个例子,谢谢
      

  2.   

    楼主真的是有够懒,连api都不肯查。
    算了,给你个示例吧:
    BigDecimal x = new BigDecimal(27.475);
    BigDecimal y = new BigDecimal(7.22);
    BigDecimal result = x.subtract(y);
    System.out.println(result);
      

  3.   

    http://www.csdn.net/develop/article/17/17400.shtm
      

  4.   

    To:  darksmile(darksmile) 
    结果不正确:是20.255000591278076171875
      

  5.   

    那这样呢?
    x = new BigDecimal(new Integer(27475), 3);
    y = new BigDecimal(new Integer(722), 2);
      

  6.   

    更正:
    x = new BigDecimal(BigInteger.valueof(27475), 3);
    y = new BigDecimal(BigInteger.valueof(722), 2);
      

  7.   

    最后放出完整版        
    BigDecimal x = new BigDecimal(BigInteger.valueOf(27475l), 3);
            BigDecimal y = new BigDecimal(BigInteger.valueOf(722l), 2);
            System.out.println(x);
            System.out.println(y);
            System.out.println(x.subtract(y));
      

  8.   

    BigDecimal x = new BigDecimal(27.475);
    BigDecimal y = new BigDecimal(7.22);
    BigDecimal result = x.subtract(y).setScale(3,BigDecimal.ROUND_HALF_DOWN);
    System.out.println(result);
      

  9.   

    To jiyunang(DANNY_JI):
    其实你犯了和我一样的错误,虽然最后的结果是对的
    BigDecimal x = new BigDecimal(27.475);
    BigDecimal y = new BigDecimal(7.22);
    问题出在这2句上。27.475是double常数,在内部存储的时候已经丧失精度了。所以x和y都是不准确的数。
    不信你可以用System.out.println(x);试试看。
    setScale(3,BigDecimal.ROUND_HALF_DOWN);对最后的结果进行了舍入操作,所以打印出来是对的。给BigDecimal赋精确值的办法只有2个:
    要么从字符串解析。
    要么采用底数,幂的形式来定义。底数一定要是大整数。
      

  10.   

    还有一种
    BigDecimal x = new BigDecimal(String.valueOf(27.475));
    BigDecimal y = new BigDecimal(String.valueOf(7.22));
    System.out.println(x);
    System.out.println(y);
    System.out.println(x.subtract(y));
      

  11.   

    TO:darksmile(darksmile) 
    我觉得用字符串解析比较好,
    因为采用底数,幂的形式来定义,
    必须精确知道小数点位置。
      

  12.   

    private double substract(double m,double s)
    {
    BigDecimal x = new BigDecimal(String.valueOf(m));
    BigDecimal y = new BigDecimal(String.valueOf(s));
    System.out.println(x);
    System.out.println(y);
    BigDecimal result = x.subtract(y);
    System.out.println(x.subtract(y));
    System.out.println(result);
    return result.doubleValue();
    }
    采用底数,幂的形式能这样用吗?
      

  13.   

    呵呵,原来你是指这个意思。的确如果原始数据是double型,的确用字符串解析比较好。
    实际上这样是用BigDecimal做桥梁。不过这样数据范围就被限定在double型之内了。
      

  14.   

    其实我们都不知道程序到底接受社么样的数据,
    private ??? substract(object m,object s)
    会更好也不一定
      

  15.   

    建议用 Number substract (Number m, Number s)
    所有的Wrapper类和BigDecimal,BigInteger都是Number的子类。
      

  16.   

    这样试试
    结果会不一样
    计算机就这样有时会出问题float a;
    float  x = 27.475f;
    float  y = 7.22f; 
    a=x-y;
    System.out.println(a);