里面用到的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 = -r;
}
return ((r >> shift) + 1) >> 1;
} else {
return (long) a;
}
}
//位运算溢出抛异常,否则返回x、y的和
public static int addExact(int x, int y) {
int r = x + y;
if (((x ^ r) & (y ^ r)) < 0) {
throw new ArithmeticException("integer overflow");
}
return r;
}
//功能跟上面相同
public static long addExact(long x, long y) {
long r = x + y;
// HD 2-12 Overflow iff both arguments have the opposite sign of the result
if (((x ^ r) & (y ^ r)) < 0) {
throw new ArithmeticException("long overflow");
}
return r;
}
//位运算溢出抛异常,否则返回x、y的差
public static int subtractExact(int x, int y) {
int r = x - y;
// HD 2-12 Overflow iff the arguments have different signs and
// the sign of the result is different than the sign of x
if (((x ^ y) & (x ^ r)) < 0) {
throw new ArithmeticException("integer overflow");
}
return r;
}
//功能跟上面相同
public static long subtractExact(long x, long y) {
long r = x - y;
// HD 2-12 Overflow iff the arguments have different signs and
// the sign of the result is different than the sign of x
if (((x ^ y) & (x ^ r)) < 0) {
throw new ArithmeticException("long overflow");
}
return r;
}
//如果x、y相乘超出int的范围,则抛异常,否则返回相乘结果
public static int multiplyExact(int x, int y) {
long r = (long)x * (long)y;
if ((int)r != r) {
throw new ArithmeticException("integer overflow");
}
return (int)r;
}
//自增1
public static int incrementExact(int a) {
if (a == Integer.MAX_VALUE) {
throw new ArithmeticException("integer overflow");
}
return a + 1;
}
//功能跟上面相同
public static long incrementExact(long a) {
if (a == Long.MAX_VALUE) {
throw new ArithmeticException("long overflow");
}
return a + 1L;
}
//自减1
public static int decrementExact(int a) {
if (a == Integer.MIN_VALUE) {
throw new ArithmeticException("integer overflow");
}
return a - 1;
}
//功能跟上面相同
public static long decrementExact(long a) {
if (a == Long.MIN_VALUE) {
throw new ArithmeticException("long overflow");
}
return a - 1L;
}
//自减a
public static int negateExact(int a) {
if (a == Integer.MIN_VALUE) {
throw new ArithmeticException("integer overflow");
}
return -a;
}
//功能跟上面相同
public static long negateExact(long a) {
if (a == Long.MIN_VALUE) {
throw new ArithmeticException("long overflow");
}
return -a;
}
//将value强转为int
public static int toIntExact(long value) {
if ((int)value != value) {
throw new ArithmeticException("integer overflow");
}
return (int)value;
}
//返回不小于x、y相除后的商的最大整数
public static int floorDiv(int x, int y) {
int r = x / y;
// if the signs are different and modulo not zero, round down
if ((x ^ y) < 0 && (r * y != x)) {
r--;
}
return r;
}
//功能跟上面相同
public static long floorDiv(long x, long y) {
long r = x / y;
// if the signs are different and modulo not zero, round down
if ((x ^ y) < 0 && (r * y != x)) {
r--;
}
return r;
}
//返回不大于余数的最大整数
public static int floorMod(int x, int y) {
int r = x - floorDiv(x, y) * y;
return r;
}
//功能跟上面相同
public static long floorMod(long x, long y) {
return x - floorDiv(x, y) * y;
}
//取反
public static int abs(int a) {
return (a < 0) ? -a : a;
}
//功能跟上面相同
public static long abs(long a) {
return (a < 0) ? -a : a;
}
//功能跟上面相同
public static float abs(float a) {
return (a <= 0.0F) ? 0.0F - a : a;
}
//功能跟上面相同
public static double abs(double a) {
return (a <= 0.0D) ? 0.0D - a : a;
}
//取最大数
public static int max(int a, int b) {
return (a >= b) ? a : b;
}
//功能跟上面相同
public static long max(long a, long b) {
return (a >= b) ? a : b;
}
private static long negativeZeroFloatBits = Float.floatToRawIntBits(-0.0f);
private static long negativeZeroDoubleBits = Double.doubleToRawLongBits(-0.0d);
//功能跟上面相同
public static float max(float a, float b) {
if (a != a)
return a;//这个是a为null的情况
if ((a == 0.0f) &&
(b == 0.0f) &&
(Float.floatToRawIntBits(a) == negativeZeroFloatBits)) {
return b;
}
return (a >= b) ? a : b;
}
//功能跟上面相同
public static double max(double a, double b) {
if (a != a)
return a;
if ((a == 0.0d) &&
(b == 0.0d) &&
(Double.doubleToRawLongBits(a) == negativeZeroDoubleBits)) {
return b;
}
return (a >= b) ? a : b;
}
//取最小数
public static int min(int a, int b) {
return (a <= b) ? a : b;
}
//功能跟上面相同
public static long min(long a, long b) {
return (a <= b) ? a : b;
}
//功能跟上面相同
public static float min(float a, float b) {
if (a != a)
return a; // a is NaN
if ((a == 0.0f) &&
(b == 0.0f) &&
(Float.floatToRawIntBits(b) == negativeZeroFloatBits)) {
// Raw conversion ok since NaN can't map to -0.0.
return b;
}
return (a <= b) ? a : b;
}
//功能跟上面相同
public static double min(double a, double b) {
if (a != a)
return a; // a is NaN
if ((a == 0.0d) &&
(b == 0.0d) &&
(Double.doubleToRawLongBits(b) == negativeZeroDoubleBits)) {
// Raw conversion ok since NaN can't map to -0.0.
return b;
}
return (a <= b) ? a : b;
}
//如果是0或者NaN,则原样返回,反之返回有符号数值
public static double signum(double d) {
return (d == 0.0 || Double.isNaN(d))?d:copySign(1.0, d);
}
//功能跟上面相同
public static float signum(float f) {
return (f == 0.0f || Float.isNaN(f))?f:copySign(1.0f, f);
}
}
Math类建议了解日常使用率高的功能即可,其他功能需要的时候回头查找jdk即可,不需要全部了解。
另外没有展示的比较重要的功能就是生成随机数的方法random(),效果是生成0~1的double类型数据