几千个浮点数相加,误差竟然达到10左右!
用不同的顺序加,误差能达到2!
太让人失望了!

解决方案 »

  1.   

    一般都是用BigDecimal
    处理精确计算的,但Java的float还是太离谱了,不知道Sun为什么要这样做?
      

  2.   

    竟有这事?举个例子?
    几千个数,是数据库中的,我用sum求和的结果与用double的差不多,但跟用float的相差太多,一开始还以为是程序有问题,后来才发现是float的问题!
      

  3.   

    http://www-128.ibm.com/developerworks/cn/java/j-jtp0114/index.html
      

  4.   

    一般情况下,精确计算处理 ,是用BigDecimal
      

  5.   

    我知道用BigDecimal可能得到精确的结果,但是我不需要太精确的结果!
    我知道float有误差,但是不知道有这么大的误差!
    为什么别的语言32位的浮点数没有这么大的误差?
      

  6.   

    如果java有这些误差,其他语言也应该有这些误差,误差是一样的。
      

  7.   

    请仔细看javadoc,java中的float类型是遵照IEEE754标准进行设计的。
    误差的出现是正常的,其本身并不是由java本身所决定,只要是遵照标准进行设计,就会有误差。精度计算请使用java.math.BigDecimal
      

  8.   

    你要是用int来处理,误差更大。每一种类型都有一定的作用范围,没什么好奇怪的。
      

  9.   

    不是float的问题,是你的使用问题.
    float的精度很小
    int i=100000001;
    float f=i; //自动转换,精度丢失.
    int num=(int)f;
    num现在的值是10000000;//最后一位丢失
      

  10.   

    出现上述情况是很正常的,凡是浮点数都有有误差的
    要记住float虽然比long的表示范围广,但是float无法正确的表示一个int类型!
      

  11.   

    你使用double就会好一些啦,为什么非得用float不过即使使用double也会出现误差,这个是没有办法的,因为毕竟精度有限
      

  12.   

    误差与java和sun无关其实,产生误差是必然的,int和float都是32位的,也就是说,都可以精确表示2^32次方的精确数据,由于int是整形,在其最大最小值范围内,都是100%精确的。而浮点型表示的是小数,而在最大,最小值范围内,小数的个数是无穷的,用有限个精确值来表示无穷多种可能,当然是极不精确(夸张点讲,如果精确度定义成精确值个数与所有可能表示的个数之比的话,这个“精确度”就是0)。而且,为了让常用的数值尽可能精确,相邻两个浮点数的精确值,在0附近比较密集(但不知道是不是正态分布),如果浮点数比较大的话,相邻两个精确值之间跨度超过几千是很正常的。
      

  13.   

    刚才试了一下,最大的float和它最接近的那个精确值之间竟然相差了2.028241E31,
    如果是double的话,这个最大跨度竟然达1.9958403095347198E292
      

  14.   

    public static void main(String[] args) throws Exception {
        int maxFloatBits = Float.floatToIntBits(Float.MAX_VALUE);
        int closestFloatBits = maxFloatBits - 1;
        float closestFloat = Float.intBitsToFloat(closestFloatBits);
        System.out.println(Float.MAX_VALUE);
        System.out.println(closestFloat);
        System.out.println(Float.MAX_VALUE - closestFloat);
        
        long maxDoubleBits = Double.doubleToLongBits(Double.MAX_VALUE);
        long closestDoubleBits = maxDoubleBits - 1;
        double closestDouble = Double.longBitsToDouble(closestDoubleBits);
        System.out.println(Double.MAX_VALUE);
        System.out.println(closestDouble);
        System.out.println(Double.MAX_VALUE - closestDouble);
      }
      

  15.   

    用法没有问题,自始至终都是用的float,没有别的类型
      

  16.   

    用double吧,在一定范围内计算的结果还是正确的
      

  17.   

    我用了double,结果还算是能接受的
    我是想知道是float的问题还是java的问题?
      

  18.   

    不是java的问题,是float本身的问题(IEEE标准)