Java 实现向上取整

技术学习 / 2022-08-02

前言

在 java 中利用计算机特性实现向上取整的巧妙方法

方法

如下公式,如果需要求 y / x 的向上取整,可以直接通过计算右边得到

yx=y+x1x\lceil \frac{y}{x} \rceil = \frac{y + x - 1}{x}

正确性

我们知道,对于一个除法来说,有着:

y=kx+by = kx + b

这样又可以分出两种情况,一种就是余数 b = 0,另一种为余数 b > 0

当余数 b = 0 时,我们向上取整的结果就为 k

而当余数 b > 0 时,向上取整的结果为 k + 1

上面的公式通过这样的转换很容易进行理解,将 y = kx + b 代入上面的公式当中可以得到:

yx=y+x1x=kx+b+x1x=k+1+b1x\lceil \frac{y}{x} \rceil = \frac{y + x - 1}{x} = \frac{kx + b + x - 1}{x} = k + 1 + \frac{b - 1}{x}

接下来对右边分别进行两种情况的讨论

  • 当余数 b = 0 时,即可以整除,此时结果变为:

    yx=k+11x\lceil \frac{y}{x} \rceil = k + 1 - \frac{1}{x}

    这里又可以进行分类

    • 由于 x 为整数,当 x = 1 时,结果显而易见为 k
    • 当 x != 1 且 x > 0,由于计算机中会对小数部分进行舍去,故右边结果为 k
    • 同理,当 x < 0 时,右边结果运算为 k
  • 当余数 b > 0 时,即不可以整除:

    • 当 x > 0 时:

      0<b<x1<b1<x1x<b1x<111x<1+b1x<20 < b < x \\ -1 < b - 1 < x \\ -\frac{1}{x} < \frac{b - 1}{x} < 1 \\ 1 - \frac{1}{x} < 1 + \frac{b - 1}{x} < 2

      由于结果为大于 1 的小数,故舍弃后的最终结果为 k + 1,符合要求

    • 当 x < 0 时:

      0<b<x1<b1<x1x>b1x>111x>1+b1x>20 < b < x \\ -1 < b - 1 < x \\ -\frac{1}{x} > \frac{b - 1}{x} > 1 \\ 1 - \frac{1}{x} > 1 + \frac{b - 1}{x} > 2

      同理,小数部分舍弃,最终结果为 k + 1,符合要求

    总结

    这种方法运用的非常巧妙,可以作为思路的启发,当然也可以使用 java 中自带的 Math 类中的静态函数进行向上取整操作