偶然间发现的一个问题,把字符串转成数值的时候有时候会不准:String data="3034.92054000007";
Float f=Float.valueOf(data);
System.out.println(f);结果如下:3034.9207另外我测试了其他的字符串与结果,如下:
0.92054000007    ----->   0.92054
1.92054000007    ----->   1.92054
34.92054000007   ----->   34.92054
134.92054000007  ----->   134.92055
334.92054000007  ----->   334.92053
1934.92054000007 ----->   1934.9205
2934.92054000007 ----->   2934.9207
3034.9205        ----->   3034.9204
3034.9201        ----->   3034.9202
3034.9202        ----->   3034.9202
3034.9203        ----->   3034.9204
3034.9204        ----->   3034.9204
3034.9205        ----->   3034.9204
3034.9206        ----->   3034.9207不知道是什么问题,请教大家!

解决方案 »

  1.   

    嗯 是这样的 不准  要是精确计算的话  就要用BigDecimal类的
    简单介绍请看:http://blog.csdn.net/justinavril/archive/2008/08/24/2823017.aspx
      

  2.   

    java解惑一书。有详细解释。。
    推荐看看。
      

  3.   

    float double 这两个都存在精度丢失问题   举个例子  float f = 0.1F;
                                                  System.out.println(Float.floatToIntBits(f));   //打印1036831949
             以上程序输出int类型的数据1036831949,它对应的32位二进制数据形式为:
    0 01111011 10011001100110011001101   符号位S是0,指数部分E为01111011,对应无符号整数123,位数部分的隐含位是1,因此实际的尾数是1。10011001100110011001101.以上二进制数据流对应的二进制数学运算表达式为: 110011001100110011001101*2的负27次方 110011001100110011001101对应的无符号整数为13421773,因此以上二进制数据表达式对应的十进制数据表达式为:13421773 * 2的负27次方  以上表达式的值为0.10000000149011611938765625  由此可见 在内存中 32位的二进制数科学计算法不能精确地表示0.1   所以在使用浮点数进行数学运算时 会导致一些误差
      

  4.   

    float double 都不准 郁闷 我还用过 四舍五入的 round 方法解决这个问题呢? 四舍五入完了还是不准~