float a = 1.0F;
float b = 0.57F;
float c = a+b;
这时为什么c的值1.5699999啊?为什么不是1.57?然后把b改为0.51,即:
float a = 1.0F;
float b = 0.51F;
float c = a+b;
这是c的值为什么又是1.51了,到底什么时候会显示9999,什么时候可以精确显示啊?

解决方案 »

  1.   

    这是因为Java本身float进行数值存储的时候总是有那么一些误差,你抛弃一个观念,计算机存储的浮点数总是正确就可以了,至于具体的原因待会给你贴。
    如果你想要精确一些的结果,用Demical这个类
      

  2.   

    第一点,你要明确java里面32位的float对0.1在内存当中的表示是不精确的,不是你理解的那么100%精确,抛弃这个概念,产生这个误差的原因简单理解在32位的float的表达能力有限和计算机的二进制缘故吧,往下说也很复杂。
    大体说下,float的0.1二进制形式是001111011 10011001100110011001101,根据符号位换算为10进制表达的值精确应该是这样计算 110011001100110011001101乘以2的负27次方,实际值是0.100000001490116119384765625
    这样就产生了实际误差
    这个误差对我们生活小打小闹没啥影响,但是对科学计算和银行这样的应用或者领域是致命的,因此要用Java银行以及科学计算会用java.math.BigDecimal提高精度,否则后果极其严重。
    可以详见http://topic.csdn.net/u/20110804/00/15380122-33a1-474a-9b7f-3e90a000f0a8.html
      

  3.   

    你痿啊,弱弱什么啊float a = 1.22222L;
    float b = 1.11111L;
    BigDecimal bg1 = new BigDecimal(String.valueOf(a));
    BigDecimal bg2 = new BigDecimal(String.valueOf(b));
    BigDecimal bg3 = bg1.add(bg2);//加法,减法、乘法、除法,看API
      

  4.   


    float c = bg3.floatValue();
      

  5.   

    这精度是得有误差的,用double