String[] array = "0.6,,0.6,0.6".split(",", -1);         float zenRotei = 0;         for (int i = 0; i < array.length; i ++) {
             String strTemp = array[i];
             if ("".equals(array[i])) {
                 strTemp = "0";
             }
             zenRotei = zenRotei + Float.parseFloat(strTemp);
         }         System.out.println("zenRotei:" + zenRotei);为什么输出为1.8000001
并且为什么只有三个都是0.6的时候才有这个现象
用BigDecimal能得到1.8,但是不知道具体的原因

解决方案 »

  1.   

    楼主需要了解一下float和double型在内存中的存储方式就会明白的。
    呵呵,可以去网上搜一下,很多的。
    float不是像int那样直接存在内存中。
    你可以搜一下float格式
      

  2.   

    float是32位浮点,Sign Bit S             Biased Exponent E             Packed Mantissa M
    1 Bit in position     8 Bits in positions 30-23     23 Bits in positions 22-0
    最终值为: (-1)^S  *  2^(E-127)  *  (1 + M/(2^23))
    附加规则:
    1.若E = 0 且 M = 0,表示值为0,所以有正负两个0.
    2.若E = 0 且 M <> 0,表示值为(-1)^S  *  2^(E-127)  *  (M/(2^22)).这种值称作denormal值,VC7内存观察器查看float值,后面跟着DEN就是这个意思.
    3.若E = 255 且 M = 0,则表示值为无穷大.
    4.若E = 255 且 M <> 0,则表示值为Not-a-Number.若M的最高位为0,则表示值为SNaN.若M的最高位为1,则表示值为QNaN.
      

  3.   

    因为是通过指数算出来的,这下可以理解为什么会有误差了吧!
    包括比较两个float是否相等 也不能直接用float,最好用相减 看误差多少。