本文记述 java.lang.Math
的一些常用方法。
除自己内部实现的代码外,好多方法都代理给 java.lang.StrictMath
。
#floor 与 ceil
- 这是一对相反的操作,即
assert Math.ceil(a)
与-Math.ceil(-a)
是等同的。 - 这两个方法都是先计算数学整数值,再转成 double 类型值
#double ceil(double a)
public static double ceil(double a) {
return StrictMath.ceil(a);
}
返回最小的 double 类型值(向负无穷方向取值),此值需满足两个条件:
- 大于或等于参数值
- 等于数学整数值
特殊情形:
- 若参数值等于数学整数值,则返回参数值
- 若参数为
NaN
、无穷值、+0
、-0
时,则返回参数值 - 若参数值在区间
(-1.0,0)
,则返回-0
#double floor(double a)
public static double floor(double a) {
return StrictMath.floor(a);
}
返回最大的 double 类型值(向正无穷方向取值),此值需满足两个条件:
- 小于或等于参数值
- 等于数学整数值
特殊情形:
- 若参数值等于数学整数值,则返回参数值
- 若参数为
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 的整数值。