当前位置:编程学习 > JAVA >>

3/2的问题..求助

                  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?   

--------------------编程问答-------------------- 为什么???? --------------------编程问答--------------------
(2/(2+1.33))*ss
(2/(2+1.33))*i/j 
你觉得这一样么?
第一个是a*(i/j)
第二个是(a*i)/j --------------------编程问答-------------------- 3楼正解. 谢谢 --------------------编程问答--------------------
引用 3 楼 q826qq1878 的回复:
3楼正解. 谢谢

谁说是正解。当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 会取整 --------------------编程问答-------------------- 一,运算法则不对
第二,你第二个算式是i/j是int型数据的运算,结果还是int型所以结果不一样啊! --------------------编程问答--------------------
引用 4 楼 lcf 的回复:
Quote: 引用 3 楼 q826qq1878 的回复:

3楼正解. 谢谢

谁说是正解。当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); 这两个一样吗? --------------------编程问答--------------------
 
  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 楼 m243723424 的回复:
Quote: 引用 4 楼 lcf 的回复:

Quote: 引用 3 楼 q826qq1878 的回复:

3楼正解. 谢谢

谁说是正解。当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 楼 lcf 的回复:
Quote: 引用 6 楼 m243723424 的回复:

Quote: 引用 4 楼 lcf 的回复:

Quote: 引用 3 楼 q826qq1878 的回复:

3楼正解. 谢谢

谁说是正解。当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就一样了
我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的 --------------------编程问答-------------------- 关键是理解类型提升跟操作数有关,跟最后赋值类型无关。
float ss = i/j; 此处i j类型为整形。
 (2/(2+1.33))*i/j 此处i j类型为double型 --------------------编程问答-------------------- 唉!这问题,,, --------------------编程问答--------------------
引用 9 楼 m243723424 的回复:
Quote: 引用 8 楼 lcf 的回复:

Quote: 引用 6 楼 m243723424 的回复:

Quote: 引用 4 楼 lcf 的回复:

Quote: 引用 3 楼 q826qq1878 的回复:

3楼正解. 谢谢

谁说是正解。当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就一样了
我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的

我说了乘法结合律的前提是在纸上而不是在计算机里计算 --------------------编程问答-------------------- 我勒个去。。。。。 --------------------编程问答-------------------- 。。。。。。。。。 好深奥的问题啊  --------------------编程问答-------------------- 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  --------------------编程问答-------------------- 3楼正解?  谁是3楼? --------------------编程问答-------------------- 这个感觉就是一个数据转换的时候丢失的那一部分照成的误差 --------------------编程问答--------------------
引用 4 楼 lcf 的回复:
Quote: 引用 3 楼 q826qq1878 的回复:

3楼正解. 谢谢

谁说是正解。当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 会取整

这个才是正解,就是截取的问题! --------------------编程问答-------------------- 除
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,