java.lang.Math

本文记述 java.lang.Math 的一些常用方法。

除自己内部实现的代码外,好多方法都代理给 java.lang.StrictMath


#floor 与 ceil


  1. 这是一对相反的操作,即 assert Math.ceil(a)-Math.ceil(-a) 是等同的。
  2. 这两个方法都是先计算数学整数值,再转成 double 类型值

#double ceil(double a)

public static double ceil(double a) {
    return StrictMath.ceil(a);
}	

返回最小的 double 类型值(向负无穷方向取值),此值需满足两个条件:

  1. 大于或等于参数值
  2. 等于数学整数值

特殊情形:

  • 若参数值等于数学整数值,则返回参数值
  • 若参数为 NaN、无穷值、+0-0时,则返回参数值
  • 若参数值在区间(-1.0,0),则返回-0

#double floor(double a)

public static double floor(double a) {
    return StrictMath.floor(a);
}

返回最大的 double 类型值(向正无穷方向取值),此值需满足两个条件:

  1. 小于或等于参数值
  2. 等于数学整数值

特殊情形:

  • 若参数值等于数学整数值,则返回参数值
  • 若参数为 NaN、无穷值、+0-0时,则返回参数值

#示例

public static void main(String[] args) {
    double a = 123.45;
    System.out.println("double a: " + a);
    System.out.println("ceil of " + a + ": " + Math.ceil(a)); // 124.0
    System.out.println("floor of " + a + ": " + Math.floor(a)); // 123.0
    System.out.println("------------------------------");

    double b = -678.90;
    System.out.println("double b: " + b);
    System.out.println("ceil of " + b + ": " + Math.ceil(b)); // -678.0
    System.out.println("floor of " + b + ": " + Math.floor(b)); // -679.0
    System.out.println("------------------------------");

    double positiveZero = Double.parseDouble("+0.0");;
    System.out.println("+0: " + positiveZero);
    System.out.println("ceil of " + positiveZero + ": " + Math.ceil(positiveZero)); // 0.0
    System.out.println("floor of " + positiveZero + ": " + Math.floor(positiveZero)); // 0.0
    System.out.println("------------------------------");

    double negativeZero = Double.parseDouble("-0.0");
    System.out.println(" -0: " + negativeZero);
    System.out.println("ceil of " + negativeZero + ": " + Math.ceil(negativeZero)); // -0.0
    System.out.println("floor of " + negativeZero + ": " + Math.floor(negativeZero)); // -0.0
    System.out.println("------------------------------");

    double nan = Double.NaN;
    System.out.println("NaN: " + nan);
    System.out.println("ceil of NaN: " + Math.ceil(nan)); // NaN
    System.out.println("floor of Nan: " + Math.floor(nan)); // NaN
    System.out.println("------------------------------");

    double positiveInfinity = Double.POSITIVE_INFINITY;
    System.out.println("正无穷: " + positiveInfinity);
    System.out.println("ceil of 正无穷: " + Math.ceil(positiveInfinity)); // Infinity
    System.out.println("floor of 正无穷: " + Math.floor(positiveInfinity)); // Infinity
    System.out.println("------------------------------");

    double negativeInfinity = Double.NEGATIVE_INFINITY;
    System.out.println("负无穷: " + negativeInfinity);
    System.out.println("ceil of 负无穷:" + Math.ceil(negativeInfinity)); // -Infinity
    System.out.println("floor of 负无穷: " + Math.floor(negativeInfinity)); // -Infinity
}

运行结果如下:


double a: 123.45
ceil of 123.45: 124.0
floor of 123.45: 123.0
------------------------------
double b: -678.9
ceil of -678.9: -678.0
floor of -678.9: -679.0
------------------------------
+0: 0.0
ceil of 0.0: 0.0
floor of 0.0: 0.0
------------------------------
 -0: -0.0
ceil of -0.0: -0.0
floor of -0.0: -0.0
------------------------------
NaN: NaN
ceil of NaN: NaN
floor of Nan: NaN
------------------------------
正无穷: Infinity
ceil of 正无穷: Infinity
floor of 正无穷: Infinity
------------------------------
负无穷: -Infinity
ceil of 负无穷:-Infinity
floor of 负无穷: -Infinity

#小结

ceil 是在参数的右侧取最小值(参数右侧即大于或等于参数值、最小值即向左边负无穷方向取);

floor 是在参数的左侧取最大值(参数左侧即小于或等于参数值、最大值即向右边正无穷方向取)。

#记忆方法

画一数轴,从左到右标上两点 f(loor)、c(eil),标记出两个区间:

  • (-∞, f]

floor 相当于从参数 f 的左侧区间中拿出最大的整数值

  • [c, +∞)

ceil 相当于从参数 c 的右侧区间中拿出最小的整数值

#释义


#mathematical integer

mathematical integer,在这里翻译成“数学整数值”。

API 中在 double IEEEremainder(double f1, double f2) 有一部分解释:

求余计算,参数遵循 IEEE 754 标准。

double remainder = f1 - f2 × n;
double quotient = f1 / f2;

quotient 在数学意义上是个精确值,但在编程中,n 称为“数学整数值”,是最接近 quotient 的整数值。