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楼正解. 谢谢 --------------------编程问答--------------------
谁说是正解。当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型所以结果不一样啊! --------------------编程问答--------------------
加入都是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 --------------------编程问答--------------------
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就一样了 --------------------编程问答--------------------
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型 --------------------编程问答-------------------- 唉!这问题,,, --------------------编程问答--------------------
我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的
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楼? --------------------编程问答-------------------- 这个感觉就是一个数据转换的时候丢失的那一部分照成的误差 --------------------编程问答--------------------
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