int i = 3;
  int j = 2 ;
 
  float ss = i/j;

  double avg = (2/(2+1.33))*ss  + (1.33/(2+1.33))*1.0050313201749201;
  
  double avg1= (2/(2+1.33))*i/j + (1.33/(2+1.33))*1.0050313201749201;
 

 
  System.out.println((ss) +" ss");
  System.out.println(avg);
  System.out.println((i/j) +" i/j");
  System.out.println(avg1);
           打印结果 :
1.0 ss
1.0020095062560492
1 i/j
1.3023098065563494
为什么 avg 跟avg1的数会差0.3?   

解决方案 »

  1.   


    (2/(2+1.33))*ss
    (2/(2+1.33))*i/j 
    你觉得这一样么?
    第一个是a*(i/j)
    第二个是(a*i)/j
      

  2.   

    谁说是正解。当i和j都是float的时候,结果是一样的。这里有一个类型转换的问题。ss = i / j,i和j都是int,那么ss就是1,但是你把i和j改成float,结果就一样了,这时候ss=3/2 = 0.666666666...。假设这不是计算机而是在纸上算,a * b / c = a * b * 1/c,然后有个东西叫乘法结合律,先算谁都一样。根本原因是Java有int/int 会取整
      

  3.   

    一,运算法则不对
    第二,你第二个算式是i/j是int型数据的运算,结果还是int型所以结果不一样啊!
      

  4.   

    谁说是正解。当i和j都是float的时候,结果是一样的。这里有一个类型转换的问题。ss = i / j,i和j都是int,那么ss就是1,但是你把i和j改成float,结果就一样了,这时候ss=3/2 = 0.666666666...。假设这不是计算机而是在纸上算,a * b / c = a * b * 1/c,然后有个东西叫乘法结合律,先算谁都一样。根本原因是Java有int/int 会取整
    加入都是int类型的话运算顺序不同结果也不同
    比如i=2;j=3;k=2
    int a=i*j/k;
    int b=i*(j/k); 这两个一样吗?
      

  5.   

     
      int i = 3;
      int j = 2 ;
      float a = i / j;//1.5
      int b = i / j;//1上述两者相差1/2,再乘上(2/(2+1.33)),最后相差0.3
      

  6.   

    谁说是正解。当i和j都是float的时候,结果是一样的。这里有一个类型转换的问题。ss = i / j,i和j都是int,那么ss就是1,但是你把i和j改成float,结果就一样了,这时候ss=3/2 = 0.666666666...。假设这不是计算机而是在纸上算,a * b / c = a * b * 1/c,然后有个东西叫乘法结合律,先算谁都一样。根本原因是Java有int/int 会取整
    加入都是int类型的话运算顺序不同结果也不同
    比如i=2;j=3;k=2
    int a=i*j/k;
    int b=i*(j/k); 这两个一样吗?你把j改成4就一样了
      

  7.   

    谁说是正解。当i和j都是float的时候,结果是一样的。这里有一个类型转换的问题。ss = i / j,i和j都是int,那么ss就是1,但是你把i和j改成float,结果就一样了,这时候ss=3/2 = 0.666666666...。假设这不是计算机而是在纸上算,a * b / c = a * b * 1/c,然后有个东西叫乘法结合律,先算谁都一样。根本原因是Java有int/int 会取整
    加入都是int类型的话运算顺序不同结果也不同
    比如i=2;j=3;k=2
    int a=i*j/k;
    int b=i*(j/k); 这两个一样吗?你把j改成4就一样了我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的
      

  8.   

    关键是理解类型提升跟操作数有关,跟最后赋值类型无关。
    float ss = i/j; 此处i j类型为整形。
     (2/(2+1.33))*i/j 此处i j类型为double型
      

  9.   

    谁说是正解。当i和j都是float的时候,结果是一样的。这里有一个类型转换的问题。ss = i / j,i和j都是int,那么ss就是1,但是你把i和j改成float,结果就一样了,这时候ss=3/2 = 0.666666666...。假设这不是计算机而是在纸上算,a * b / c = a * b * 1/c,然后有个东西叫乘法结合律,先算谁都一样。根本原因是Java有int/int 会取整
    加入都是int类型的话运算顺序不同结果也不同
    比如i=2;j=3;k=2
    int a=i*j/k;
    int b=i*(j/k); 这两个一样吗?你把j改成4就一样了我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的
    我说了乘法结合律的前提是在纸上而不是在计算机里计算
      

  10.   

    float ss = i/j;这个ss是i/j的结果  double avg = (2/(2+1.33))*ss  + (1.33/(2+1.33))*1.0050313201749201;
    这个是直接乘以ss,即乘以i/j的结果
      
      double avg1= (2/(2+1.33))*i/j + (1.33/(2+1.33))*1.0050313201749201;
    而这里是先乘以i然后再除以j 
      

  11.   

    谁说是正解。当i和j都是float的时候,结果是一样的。这里有一个类型转换的问题。ss = i / j,i和j都是int,那么ss就是1,但是你把i和j改成float,结果就一样了,这时候ss=3/2 = 0.666666666...。假设这不是计算机而是在纸上算,a * b / c = a * b * 1/c,然后有个东西叫乘法结合律,先算谁都一样。根本原因是Java有int/int 会取整
    这个才是正解,就是截取的问题!