3/2的问题..求助

93年颈椎病人 2013-05-08 11:58:43
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?

...全文
283 19 打赏 收藏 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
拾薪 2013-05-09
  • 打赏
  • 举报
回复
引用 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 会取整[/quote] 这个才是正解,就是截取的问题!
lcf 2013-05-08
  • 打赏
  • 举报
回复
引用 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 会取整
93年颈椎病人 2013-05-08
  • 打赏
  • 举报
回复
3楼正解. 谢谢
失落夏天 2013-05-08
  • 打赏
  • 举报
回复
(2/(2+1.33))*ss (2/(2+1.33))*i/j 你觉得这一样么? 第一个是a*(i/j) 第二个是(a*i)/j
跳蚤图 2013-05-08
  • 打赏
  • 举报
回复
为什么????
书断华 2013-05-08
  • 打赏
  • 举报
回复
这个感觉就是一个数据转换的时候丢失的那一部分照成的误差
andycpp 2013-05-08
  • 打赏
  • 举报
回复
3楼正解? 谁是3楼?
Ada168855 2013-05-08
  • 打赏
  • 举报
回复
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
bjh1988 2013-05-08
  • 打赏
  • 举报
回复
。。。。。。。。。 好深奥的问题啊
yongtaimen 2013-05-08
  • 打赏
  • 举报
回复
我勒个去。。。。。
lcf 2013-05-08
  • 打赏
  • 举报
回复
引用 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 会取整[/quote] 加入都是int类型的话运算顺序不同结果也不同 比如i=2;j=3;k=2 int a=i*j/k; int b=i*(j/k); 这两个一样吗?[/quote] 你把j改成4就一样了[/quote]我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的[/quote] 我说了乘法结合律的前提是在纸上而不是在计算机里计算
胖名 2013-05-08
  • 打赏
  • 举报
回复
唉!这问题,,,
fei1710 2013-05-08
  • 打赏
  • 举报
回复
关键是理解类型提升跟操作数有关,跟最后赋值类型无关。 float ss = i/j; 此处i j类型为整形。 (2/(2+1.33))*i/j 此处i j类型为double型
Bettygonna 2013-05-08
  • 打赏
  • 举报
回复
引用 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 会取整[/quote] 加入都是int类型的话运算顺序不同结果也不同 比如i=2;j=3;k=2 int a=i*j/k; int b=i*(j/k); 这两个一样吗?[/quote] 你把j改成4就一样了[/quote]我只是想表达“然后有个东西叫乘法结合律,先算谁都一样。”是不对的
lcf 2013-05-08
  • 打赏
  • 举报
回复
引用 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 会取整[/quote] 加入都是int类型的话运算顺序不同结果也不同 比如i=2;j=3;k=2 int a=i*j/k; int b=i*(j/k); 这两个一样吗?[/quote] 你把j改成4就一样了
Mourinho 2013-05-08
  • 打赏
  • 举报
回复
 
  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
Bettygonna 2013-05-08
  • 打赏
  • 举报
回复
引用 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 会取整[/quote] 加入都是int类型的话运算顺序不同结果也不同 比如i=2;j=3;k=2 int a=i*j/k; int b=i*(j/k); 这两个一样吗?
Bettygonna 2013-05-08
  • 打赏
  • 举报
回复
一,运算法则不对 第二,你第二个算式是i/j是int型数据的运算,结果还是int型所以结果不一样啊!
代码下载地址: https://pan.quark.cn/s/48b01f0717eb 本文将详细研究有关rtl8822蓝牙驱动及其适配的相关信息。rtl8822是由Realtek公司设计的一种无线通信芯片,主要应用于提供Wi-Fi和蓝牙功能。该芯片被广泛应用于多种现代电子设备中,例如笔记本电脑、路由器、智能手机以及平板电脑等。 我们首先需要理解“驱动”的定义。驱动程序充当计算机硬件与操作系统之间的中介,负责将硬件指令解释为操作系统能够识别的语言。对于rtl8822芯片而言,蓝牙驱动是控制该芯片执行蓝牙通信的核心软件模块,它确保设备能够准确识别并连接其他蓝牙设备。 rtl8822驱动资料通常包括以下几个部分: 1. **Bluetooth Baseband (BB) 驱动**:这一部分负责处理蓝牙的底层通信,包括射频信号的编码与解码,以及数据包的发送和接收。 2. **Bluetooth Host Controller Interface (HCI)**:HCI层是蓝牙驱动的重要组成部分,它确立了蓝牙主机(例如CPU)与控制器(例如rtl8822芯片)之间的接口协议。借助HCI,应用程序能够与蓝牙设备进行互动,如配对、建立连接、传输数据等。 3. **移植文档**:移植文档是将rtl8822蓝牙驱动适配至不同操作系统或平台的关键指南,其中通常包含了详尽的步骤、注意事项以及可能遇到的问题的解决方案。这些文档有助于开发者理解驱动的工作原理,并根据目标系统进行必要的调整。 4. **芯片手册**:Realtek为rtl8822芯片提供的手册是开发和调试驱动的重要参考资料,其中涵盖了芯片的硬件特性、寄存器布局、接口规范、功耗管理等内容。熟悉这些信息能够帮助开发者更深入地...

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧