【问题标题】:what does the instruction Math.floor doMath.floor 指令是做什么的
【发布时间】:2018-04-01 09:29:50
【问题描述】:

我试图弄清楚这个语句的含义以及变量larg 包含的内容:

int larg;
larg = ((larg % 8 != 0) ? (int) (Math.floor(larg / 8.0) + 1) * 8 : larg);

【问题讨论】:

标签: java


【解决方案1】:

部分

(larg % 8 != 0)

询问 larg 是否不会在没有余数的情况下除以 8。如果是的话

(int) (Math.floor(larg / 8.0) + 1) * 8 

执行时将 larg 除以 8,向下舍入舍弃余数并加一,然后乘回 8。这意味着找到下一个大于 larg 的 8 倍数。

这被放在一个三元运算符...? ... : ... 中,它是一个 if 语句。所以

larg =((larg % 8 != 0) ? (int) (Math.floor(larg / 8.0) + 1) * 8 : larg);

表示:“如果 larg 不是 8 的倍数,则向上舍入到下一个 8 的倍数,否则将其设置为自身”。另一种说法(整数除以整数会丢弃分数)

if (larg % 8 != 0) {
    larg = ((larg / 8) + 1) * 8;
}

这段代码很可能是由一位经验不足的程序员编写的,他更喜欢单行而不是三行if-语句。更有经验的程序员会知道可读性比保持一行更重要,因此像您这样的未来读者会理解它,而不必在这里问。

【讨论】:

  • 因为我们的目的是四舍五入到下一个 8 的倍数,所以更直观的写法是larg = Math.ceil(larg / 8.0) * 8;,完全没有任何条件逻辑。
  • 在你的最后一个例子中,你应该提到larg 也必须是不可或缺的才能工作。虽然我现在注意到 OP 已更新问题以包含 int 声明。
  • @DawoodibnKareem 使用双精度数进行整数运算很少是最有效的。
猜你喜欢
  • 2016-07-06
  • 2014-02-21
  • 2011-04-28
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2012-08-27
  • 2017-03-29
相关资源
最近更新 更多