里面用到的StrictMath类绝大数都是底层实现的,目前还看不到实现方式,下面就贴出可以看出实现方式的功能
public final class Math{
private Math() {
}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
//以度为单位的角度转换为用弧度表示的近似相等的角度
public static double toRadians(double angdeg) {
return angdeg / 180.0 * PI;
}
//转换关系跟上面相反
public static double toDegrees(double angrad) {
return angrad * 180.0 / PI;
}
//取整
//规则:当X为正数时,第一步先X+0.5,然后取整
// 当X为负数时,第一步先X+0.5,第二步观察得到的结果的小数点左边的数为多少,并判断+0.5后得到的数大于0还是小于0,小于0则最后的取整的结果为-(小数点左边的数+1),大于0则取整结果为小数点左边的数
public static int round(float a) {
int intBits = Float.floatToRawIntBits(a);
int biasedExp = (intBits & FloatConsts.EXP_BIT_MASK)
>> (FloatConsts.SIGNIFICAND_WIDTH - 1);
int shift = (FloatConsts.SIGNIFICAND_WIDTH - 2
+ FloatConsts.EXP_BIAS) - biasedExp;
if ((shift & -32) == 0) {
int r = ((intBits & FloatConsts.SIGNIF_BIT_MASK)
| (FloatConsts.SIGNIF_BIT_MASK + 1));
if (intBits < 0) {
r = -r;
}
return ((r >> shift) + 1) >> 1;
} else {
return (int) a;
}
}
//功能跟上面一样
public static long round(double a) {
long longBits = Double.doubleToRawLongBits(a);
long biasedExp = (longBits & DoubleConsts.EXP_BIT_MASK)
>> (DoubleConsts.SIGNIFICAND_WIDTH - 1);
long shift = (DoubleConsts.SIGNIFICAND_WIDTH - 2
+ DoubleConsts.EXP_BIAS) - biasedExp;
if ((shift & -64) == 0) {
long r = ((longBits & DoubleConsts.SIGNIF_BIT_MASK)
| (DoubleConsts.SIGNIF_BIT_MASK + 1));
if (longBits < 0) {
r