public class Test
{
public static void main(String[] args)
{
float a = 0.083f;
System.out.println("a = " + a);
System.out.println("a*100 = " + a*100);
float b = 0.084f;
System.out.println("b = " + b);
System.out.println("b*100 = " + b*100);
}
}大家看看结果是什么?

解决方案 »

  1.   

    float本来就不能精确表示小数
      

  2.   

    我的答案是a = 0.083
    a*100 = 8.299999
    b = 0.084
    b*100 = 8.4不足为怪,float型就是不精确的小数
      

  3.   

    除了3,9?
    你试试class Test {
    public static void main(String[] args) {
    float f=1.05f;
    System.out.println(100*f);
    }
    }
      

  4.   

    好一个BUG
    浮点型永远不会精确
      

  5.   

    改一下代码,多输出几位有效数字,你就能看到真实的情况了:
     public static void main(String args[]) throws Exception {
         float a = 0.083f;
            System.out.printf("a = %12.9f\n" , a);
            System.out.printf("a*100 = %12.9f\n" , a*100);
            float b = 0.084f;
            System.out.printf("b = %12.9f\n", b);
            System.out.printf("b*100 = %12.9f\n" ,b*100);  
      }输出如下:
    F:\java>java Test
    a =  0.082999997
    a*100 =  8.299999237
    b =  0.083999999
    b*100 =  8.399999619如果有效数字少,四舍五入之后,后面全是0,就不输出了,所以输出是0.083之类的你以为是精确的了,其实不然。也不是所有的浮点数都没有办法精确表示。应该是不能精确转为二进制小数的浮点数,没有办法精确表示。
    比如0.5、0.25、0.125、0.0625...(分别是2^-1、2^-2、2^-3...)等之类的小数(以及由它们的和组成的小数,如0.75)是可以精确表示的。
      

  6.   

    JAVA高效编程中有例子,用double,float做 运算会有问题的,要用BigDecimal。
      

  7.   

    更有趣的是:
            float a = 0.083f;
            System.out.println("a = " + a);
            System.out.println("a*100 = " + a*100);把其的System.out.println("a*100 = " + a*100);改成
    System.out.println("a*100 = " + a*1000/10);居然结果又变成8.3了(java下)但C#下却不会。
      

  8.   

    LZ你还是没搞懂,8楼人家解释得很清楚了,是你的显示位数不够你真的要分析这是不是bug的话,我建议你去研究下十进制小数是怎么转为二进制小数的纯小数转浮点数,网上很多资料……