【问题标题】:casting to int order of operations转换为 int 操作顺序
【发布时间】:2017-08-22 16:09:41
【问题描述】:

我无法理解为什么以下两个应该有任何区别:

double d = 251.2453;
System.out.println(d);
d = .01 * ((int) (d * 100));
System.out.println(d);

输出

251.2453
251.24

与以下输出相比,在强制转换之前除以 100 而不是乘以 .01:

double d = 251.2453;
System.out.println(d);
d = ((int) (d * 100)) / 100;
System.out.println(d);

输出

251.2453
251.0

【问题讨论】:

  • 因为100int.01 不是。
  • 除以 100 是整数运算,所以结果是 int,乘以 0.01 是浮点运算,结果是 double。注意:这两个选项都不是特别有用。我建议做Math.floor(d * 100) / 100.0,它不太可能溢出,并且表示错误更少。

标签: java casting int double


【解决方案1】:

d = .01 * ((int) (d * 100));

  1. d * 100 -> 仍然是double - 25124.53
  2. (int) ... -> 现在是 int,所以向下舍入 - 25124
  3. .01 * ( ... -> 现在是 float - 251.24
  4. d = - 现在又是双倍 - 251.24

d = ((int) (d * 100)) / 100;

  1. d * 100 -> 仍然是double - 25124.53
  2. (int) ... -> 现在是 int - 25124
  3. ... ) / 100 -> 仍然是 int - 251
  4. d = - 现在又是双倍 - 251.0

【讨论】:

    【解决方案2】:

    在第二种情况下,您将整数除以整数,因此结果是整数,而在第一种情况下,您乘以 0.1,因此转换为浮点数。

    【讨论】:

      【解决方案3】:

      在第一个代码中,请注意

      (d * 100)
      

      括在括号内。所以先做这个操作,返回的值为

      251.2453 * 100 = 25124.53
      

      然后返回 25124.53 的 (int),即 25124。
      现在,你得到了

      .01 * 25124 = 251.24
      


      在第二种情况下,d * 100 再次被括在括号中,因此首先执行操作,然后返回该结果的 (int),即:
      (int) 25124.53 = 25124
      

      现在,25124 是 int100 也是。因此,会发生整数除法,它会在忽略小数部分后返回值。所以你得到了

      25124 / 100 = 251
      

      该值存储为double,最终变为

      251.0
      

      Q.E.D.

      【讨论】:

        【解决方案4】:

        第一种情况

        d = .01 * ((int) (d * 100));
        

        其实是

        .01* 25124 = 251.24
        

        第二种情况

        d = ((int) (d * 100)) / 100;
        

        其实是

        d= ((int) 25124.53)/100 = 25124/100 = 251
        (it's division of int by int equal to int)
        

        现在当您打印 d 时,它的输出为 251.0

        【讨论】:

          猜你喜欢
          • 2018-06-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-09
          • 2017-05-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多