黑马程序员技术交流社区

标题: 运算顺序问题 [打印本页]

作者: 侯丛政    时间: 2013-2-16 15:27
标题: 运算顺序问题
float f = 3.1415926f;
System.out.println((int)(f*100)*1.0/100); //  结果是3.14, 但是不知道这个(int)(f*100)*1.0/100的运算顺序是怎么回事呢? 断点后也看不懂, 只能求救了.


作者: 铿锵科技    时间: 2013-2-16 16:05
float f = 3.1415926f;

System.out.println((((int)(f*100/*执行1*/)/*执行2*/)*1.0/*执行3*/)/100/*最后除以100*/);//按数字顺序执行
System.out.println((int)((f*100)*1.0)/100); //这样输出的是整数除法的结果
System.out.println((int)((f*100)*1.0/100)); //这样输出的是浮点数除以整数的结果转为整数
作者: 黄玉昆    时间: 2013-2-16 18:28
  1. class Test02
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 float f = 3.1415925f;
  6.                 //int x = (int)(f*100)*1.0/100;//报错:可能会损失精度,需要double型
  7.                 int m = 3;
  8.                 double n = (double)(m*100)*1.0/100;
  9.                 System.out.println((f*100));//314.15924
  10.                 System.out.println((int)(f*100));//314
  11.                 System.out.println((int)(f*100)*1.0);//314.0
  12.                 System.out.println((int)(f*100*1.0/100));//3
  13.                 System.out.println((f*100)*1.0/100);//3.1415924072265624
  14.                 System.out.println((int)(f*100)*1.0/100);//3.14
  15.                 System.out.println(n);//3.0
  16.         }
  17. }
复制代码
这是我的测试,可以看出,顺序如下:
执行顺序:(f*100)   ------>(int)--->  *1.0  ----->/100
得出结果:314.15924       314       314.0           3.14
结果已经很明显了,在这里括号的优先级是最高的,先运算,所以结果是3.14,那为什么最后结果不是int型呢,我认为用println打印,这里是可以接收任何打印的结果的,也就是说你运算的结果为double型,它也照打不误。
其中我又测试了两中类型转换方式,为什么定义的int的x就会报错呢,是因为double的精度最好,比int范围要大,简单说,double是可以装下int的。
所以,综合看出,打印3.14是没什么疑问了。
在此,我也遇到了一个问题,定义的f是3.1415925f,但是打印结果却不一样,是314.15924和3.1415924072265624,
当改为3.141592f或3.1415921f,结果为:3.141592和3.1415921020507813,为什么5变4了,1变没了?正在研究中...........

作者: 刘策    时间: 2013-2-16 19:59
黄玉昆 发表于 2013-2-16 18:28
这是我的测试,可以看出,顺序如下:
执行顺序:(f*100)   ------>(int)--->  *1.0  ----->/100
得出结果: ...

好像和float 的精度,有效位,还有就是数据在计算中的存储有关吧,继续研究。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2