Java 数字与 Math 类

Java 运算符 一节中我们已经介绍过一些简单的运算符号了, 比如 +, -, *, / 等.

同时在 Java 的基础数据类型 一节中, 我们也了解到, 所有的基础类型都有其封装类,如 Byte, Integer, Double 等.

以下是各种数字类型的, 对应的封装类的列表:

基础类型 对应的包装类
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double

封装类提供了各种便捷的方法, 用于类型之间的转换, 同时也可以直接和对应的基础类型做直接运算.

示例代码如下:

package com.yi21.math;

public class Yi21Math {
    public static void main(String[] args) {
        Integer i = 200;
        Float f = Float.valueOf("100.2");
        long l = i.longValue();
        byte b = f.byteValue();
        System.out.println(f + " & " + b);
        System.out.println(f + 1);
        System.out.println(l / 2.0);
    }
}

从上述代码中我们可以看到, 经过封装类的特殊方法(例如 Float.vlaueOf()), 我们甚至可以将字符串转换成我们想要的数据类型.

基础类型的转换

除了上述的封装类型可以做数据类型转换以外, 我们还可以通过 (type) 值 的格式做显式基础类型的转换, 同时类型按容量大小的差异可以做隐式转换, 容量大小的排序如下: byte, short, char < int long <float double, 实际使用的代码示例如下:

double d = 10000;
int i = (int) d;
System.out.println(i);
float f = (float) i;
System.out.println(f);
byte b = (byte) f;
System.out.println(b);
//隐式转换
double d2 = f;
System.err.println(d2);
int i2 = b;
System.err.println(i2);

Math 类的使用

Math 类提供了进一步的针对数学方面的计算的支持. 这种支持不仅仅是提供了方法, 如 cos(余弦), sin(正弦), exp(自然常数e的n次幂), min(求最小值) 这些, 还提供了一些很常用的数学常量, 比如 PI, 圆周率的值, E 自然常数的值.

Math 的完整名称是 java.lang.Math, 因为是 java 自带方法, 所以无需使用完整的包名引入. 这一点和 String, RuntimeException 等类似. 

下面我们来看看一些常见的数学方法的使用示例, 具体方法的作用参见示例中的注释:

package com.yi21.math;

public class Yi21Math3 {
    public static void main(String[] args) {
        //输出自然常数的值
        System.out.println(Math.E);
        //输出自然常数的一次幂 等于 自然常数
        System.out.println(Math.exp(1) == Math.E);
        //输出自然常数的二次幂 却不等于 自然常数 * 自然常熟, 参照结果我们发现是出现了精度丢失的问题
        System.out.println(Math.exp(2) + " == " + Math.E * Math.E + " : " + (Math.exp(2) == Math.E * Math.E));

        //用 Math.sin 一个角度的正弦, 结果不是 0.5 出现了精度丢失问题
        //使用 Math.toRadians() 将角度的值转换为对应的小数
        System.out.println(Math.sin(Math.toRadians(30)));
        //360° = 2 * PI 是一个正圆, 从圆心取一个30°的角就是 2 * PI / 12 = PI / 6
        System.out.println(Math.sin(Math.PI / 6));
        //结果也符合我们的预期
        System.out.println(Math.sin(Math.toRadians(30)) == Math.sin(Math.PI / 6));
        
        System.out.println("向下取整: " + Math.floor(3.54));
        System.out.println("向上取整: " + Math.ceil(3.54));
        System.out.println("向上取整2: " + Math.ceil(3.0));
        System.out.println("四舍五入取整: " + Math.round(Math.PI));
        System.out.println("-1 的绝对值: " + Math.abs(-1));
        System.out.println("3 的平方根: " + Math.sqrt(3));
        System.out.println("2 的 10 次方: " + Math.pow(2, 10));
        System.out.println("100 和 10 哪个大? " + Math.max(100, 10));
    }
}

关于 Math 的更多用法, 请参见 Java 数学手册

下一节, 请看 Java 的时间和日期