1. ceil、floor和round的功能
首先,这三个方法都是Math类的静态方法,而且类Math在java.lang包下,所以我们在代码中可以直接调用Math的方法。
Math.ceil(double a)实现的是对小数向右取整,如 Math.ceil(-0.7) = -0.0,Math.ceil(0.5) = 1.0, Math.ceil(1.3) = 2.0
Math.floor(double a)实现的是对小数向左取整,如 Math.floor(-0.7) = -1.0,Math.floor(0.5) = 0.0, Math.floor(1.3) = 1.0
Math.round(double a)实现的逻辑是四舍五入,但是对于负数有点不一样,如 Math.round(-1.5) = -1,Math.round(-0.5) = 0,有点绕,所以为了好记点,等效为 Math.floor(a+0.5),而且返回的是整数。
2. ceil、floor源码
2.1 ceil和floor代码
因为round可通过floor来实现,所以round源码就不多加分析,主要分析ceil和floor方法,从下图我们可以知道ceil和floor方法实际上都是调用floorOrCeil方法实现,只是参数不一样。参数后续分析,所以我们接下来分析floorOrCeil这个方法。
2.2 floorOrCeil源码
看了源代码,有点复杂,接下来我们一段一段分析
2.2.1
int exponent = Math.getExponent(a);
这个方法是得到浮点数a的指数部分,这个指数不是我们的科学计算法中的以10