ZetCode

Java Math 类

最后修改时间:2025 年 4 月 13 日

java.lang.Math 类提供了用于执行各种数学运算的静态方法。这些运算包括指数、对数、三角函数、舍入和随机数函数。由于所有方法都是静态的,因此无法实例化该类。

Math 类适用于像 doubleint 这样的原始类型。对于需要更高精度的应用程序,请考虑使用 BigDecimal,它为财务计算和科学计算提供更好的精度。

此类还定义了两个重要的常量:Math.PI,数学常量 π (~3.14159),以及 Math.E,自然对数的底数 (~2.71828)。这些常量广泛应用于几何、物理和数值分析中。

Math 类概述

Math 类提供了用于基本算术、三角学、指数运算、对数、舍入和随机数生成的方法。由于所有方法都是静态的和线程安全的,因此无需创建对象即可使用,并且对于并发操作是安全的。

此类属于 java.lang 包,这意味着它会自动导入到所有 Java 程序中,从而无需显式导入语句即可立即访问其功能。

基本算术运算

Math 类提供了用于基本算术运算的方法,如绝对值、最大值/最小值和平方根。这些方法针对性能进行了优化,并能正确处理边缘情况。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        // Absolute value
        int absValue = Math.abs(-15);
        System.out.println("Absolute value of -15: " + absValue);
        
        // Maximum and minimum
        int max = Math.max(10, 20);
        int min = Math.min(10, 20);
        System.out.println("Max of 10 and 20: " + max);
        System.out.println("Min of 10 and 20: " + min);
        
        // Square root
        double sqrt = Math.sqrt(25);
        System.out.println("Square root of 25: " + sqrt);
        
        // Power
        double power = Math.pow(2, 3);
        System.out.println("2 raised to power 3: " + power);
    }
}

此示例演示了基本算术运算。Math.abs 返回绝对值,Math.max/min 比较值,Math.sqrt 计算平方根,Math.pow 处理指数。所有方法都很容易使用。

三角函数

Math 类提供了标准的三角函数,包括正弦、余弦和正切。这些方法以弧度为单位取角度。对于度数转换,请使用 Math.toRadiansMath.toDegrees

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        // Convert 30 degrees to radians
        double radians = Math.toRadians(30);
        System.out.println("30 degrees in radians: " + radians);
        
        // Trigonometric functions
        double sinValue = Math.sin(radians);
        double cosValue = Math.cos(radians);
        double tanValue = Math.tan(radians);
        
        System.out.println("Sine of 30°: " + sinValue);
        System.out.println("Cosine of 30°: " + cosValue);
        System.out.println("Tangent of 30°: " + tanValue);
        
        // Inverse trigonometric functions
        double asinValue = Math.asin(sinValue);
        System.out.println("Arcsine of sin(30°): " + 
                          Math.toDegrees(asinValue) + "°");
    }
}

此示例显示了三角运算。我们首先将度数转换为弧度,然后计算正弦、余弦和正切。反函数返回以弧度表示的结果,为了可读性,我们将其转换回度数。

指数和对数函数

Math 类提供了用于指数和对数计算的方法。Math.exp 计算 e^x,而 Math.log 计算自然对数(底数为 e)。对于以 10 为底的对数,请使用 Math.log10

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        // Exponential function
        double expValue = Math.exp(1);
        System.out.println("e^1: " + expValue);
        System.out.println("Math.E: " + Math.E);
        
        // Natural logarithm
        double logValue = Math.log(Math.E);
        System.out.println("ln(e): " + logValue);
        
        // Base 10 logarithm
        double log10Value = Math.log10(100);
        System.out.println("log10(100): " + log10Value);
        
        // Combining operations
        double result = Math.pow(2, Math.log10(100));
        System.out.println("2^log10(100): " + result);
    }
}

此示例演示了指数和对数函数。我们展示了 Math.expMath.log 之间的关系,以及它们如何与常量 Math.E 相关联。该示例还展示了如何将这些运算与其他 Math 方法结合使用。

舍入方法

Math 类提供了几种具有不同行为的舍入方法。Math.round 执行标准舍入,而 Math.ceil 始终向上舍入,Math.floor 始终向下舍入。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        double num1 = 3.4;
        double num2 = 3.6;
        double num3 = -3.4;
        
        // Standard rounding
        System.out.println("Round 3.4: " + Math.round(num1));
        System.out.println("Round 3.6: " + Math.round(num2));
        
        // Ceiling (round up)
        System.out.println("Ceil 3.4: " + Math.ceil(num1));
        System.out.println("Ceil -3.4: " + Math.ceil(num3));
        
        // Floor (round down)
        System.out.println("Floor 3.6: " + Math.floor(num2));
        System.out.println("Floor -3.4: " + Math.floor(num3));
        
        // Truncate using casting
        System.out.println("Truncate 3.6: " + (int) num2);
    }
}

此示例显示了不同的舍入方法。Math.round 遵循标准舍入规则,而 Math.ceilMath.floor 始终在特定方向上舍入。该示例还展示了如何使用强制类型转换进行截断。

随机数生成

Math.random 方法生成 0.0(包括)和 1.0(不包括)之间的伪随机数。要更好地控制随机数,请考虑使用 java.util 包中的 Random 类。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        // Simple random number
        double random1 = Math.random();
        System.out.println("Random between 0 and 1: " + random1);
        
        // Random number in range
        int min = 10;
        int max = 20;
        int randomInRange = (int) (Math.random() * (max - min + 1)) + min;
        System.out.println("Random between 10 and 20: " + randomInRange);
        
        // Multiple random numbers
        System.out.println("\nFive random numbers:");
        for (int i = 0; i < 5; i++) {
            System.out.println(Math.random());
        }
    }
}

此示例演示了随机数生成。我们展示了如何获取一个简单的随机数,以及如何将其缩放到特定范围。范围缩放公式对于随机数的实际应用非常重要。

数学常数

Math 类提供了两个重要的数学常数:Math.PI (π) 和 Math.E(自然对数的底数)。这些常数以高精度定义,并在许多数学计算中非常有用。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        // Circle calculations using PI
        double radius = 5.0;
        double circumference = 2 * Math.PI * radius;
        double area = Math.PI * Math.pow(radius, 2);
        
        System.out.println("Circle with radius 5:");
        System.out.println("Circumference: " + circumference);
        System.out.println("Area: " + area);
        
        // Exponential growth using E
        double initial = 100;
        double rate = 0.05;
        double time = 10;
        double finalAmount = initial * Math.exp(rate * time);
        
        System.out.println("\nExponential growth:");
        System.out.println("Initial: " + initial);
        System.out.println("Final after 10 years at 5%: " + finalAmount);
    }
}

此示例显示了数学常数的实际用途。我们使用 Math.PI 计算圆的属性,并使用 Math.E 对指数增长进行建模。这些常数对于许多科学和工程计算至关重要。

高级数学运算

Math 类还提供更高级的运算,如双曲函数、角度转换和 IEEE 余数。这些方法对于专门的数学计算非常有用。

Main.java
package com.zetcode;

public class Main {

    public static void main(String[] args) {
        
        // Hyperbolic functions
        double x = 1.0;
        System.out.println("sinh(1.0): " + Math.sinh(x));
        System.out.println("cosh(1.0): " + Math.cosh(x));
        System.out.println("tanh(1.0): " + Math.tanh(x));
        
        // IEEE remainder
        System.out.println("\nIEEE remainder:");
        System.out.println("IEEEremainder(10, 3): " + 
                          Math.IEEEremainder(10, 3));
        System.out.println("10 % 3: " + (10 % 3));
        
        // Copy sign
        System.out.println("\nCopy sign:");
        System.out.println("copySign(5.0, -1.0): " + 
                          Math.copySign(5.0, -1.0));
        System.out.println("copySign(-5.0, 1.0): " + 
                          Math.copySign(-5.0, 1.0));
    }
}

此示例演示了高级 Math 类运算。双曲函数类似于三角函数,但基于双曲线。IEEE 余数与其处理负数的方式不同于模运算符。copySign 可用于操作数字符号。

来源

Java Math 类文档

在本文中,我们通过实际示例介绍了 Java Math 类的所有主要方法。这些方法提供了基本的数学运算,这些运算是许多编程任务的基础。

作者

我叫 Jan Bodnar,是一名经验丰富的程序员。我于 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程