Java 数学运算与 Math 类

更新于 2025-12-25

Jakob Jenkov 发布于 2021-03-11

Java 内置了一组数学运算符,用于对变量执行基本的数学运算。这些运算符相当简单。此外,Java 还提供了 Math 类,其中包含用于执行更高级数学计算的方法。本教程将详细介绍 Java 的数学运算符以及 Math 类。

Java 数学运算符

首先介绍 Java 中的四种基本数学运算符:

运算符 说明
+ 加法
- 减法
* 乘法
/ 除法

以下各节将详细解释这些运算符。

加法(Addition)

+ 运算符用于两个值相加。可以是两个常量、一个常量与一个变量,或两个变量相加。例如:

int sum1 = 10 + 20;          // 两个常量相加
int sum2 = sum1 + 33;        // 变量与常量相加
int sum3 = sum2 + sum2;      // 两个变量相加

在运行时,表达式 sum1 + 33 会被替换为 sum1 的值与常量 33 的和。

你也可以进行多个数值的连续加法:

int sum1 = 10 + 20 + 30;
int sum3 = sum2 + 99 + 123 + 1191;

一种常见的操作是将变量设置为其自身值加上另一个值:

int result = 10;
result = result + 20;

由于这种操作非常常见,Java 提供了复合赋值运算符 +=

int result = 10;
result += 20;  // 等价于 result = result + 20;

减法(Subtraction)

- 运算符用于从一个值中减去另一个值。例如:

int diff1 = 200 - 10;
int diff2 = diff1 - 5;
int diff3 = diff1 - diff2;

同样支持连续减法:

int diff = 200 - 10 - 20;

注意:负负得正,例如:

int diff = 200 - (-10);  // 结果为 210

Java 也提供了 -= 运算符用于简化变量自减操作:

int result = 200;
result -= 10;  // 等价于 result = result - 10;

乘法(Multiplication)

* 运算符用于两个值相乘:

int prod1 = 10 * 20;
int prod2 = prod1 * 5;
int prod3 = prod1 * prod2;

支持连续乘法:

int prod = 10 * 20 * 30;

Java 提供了 *= 运算符用于变量自乘:

int result = 10;
result *= 20;  // 等价于 result = result * 20;

注意:原文此处误写为 +=,应为 *=

除法(Division)

/ 运算符用于一个值除以另一个值:

int division1 = 100 / 10;
int division2 = division1 / 2;
int division3 = division1 / division2;

连续除法需要注意运算顺序:

int division = 100 / 10 / 2;  // 结果为 5((100/10)/2)

若想先计算 10 / 2,再用 100 除以其结果,需使用括号:

int division = 100 / (10 / 2);  // 结果为 20

Java 提供了 /= 运算符用于变量自除:

int result = 100;
result /= 5;  // 等价于 result = result / 5;

取余 / 模运算(Remainder / Modulo)

% 运算符用于整数除法后取余数:

int value = 100;
int remainder = value % 9;  // 100 ÷ 9 = 11 余 1,因此 remainder = 1

Java 提供了 %= 运算符:

int result = 100;
result %= 9;  // result = 1

Java 运算符优先级

当组合多个运算符时,需注意运算顺序。Java 的运算符优先级与标准数学一致:

  • */ 优先级高于 +-
  • 同级运算符从左到右依次计算

例如:

int result = 100 * 100 / 5 + 200 * 3 / 2;

计算顺序:

  1. 100 * 100 = 10000
  2. 10000 / 5 = 2000
  3. 200 * 3 = 600
  4. 600 / 2 = 300
  5. 2000 + 300 = 2300

使用括号可改变优先级:

int result = 100 * 100 / (5 + 200) * 3 / 2;  // 结果为 72

Java 整数运算

Java 整数类型(byteshortintlong)的运算会截断小数部分:

int result = 100 / 8;  // 结果为 12(而非 12.5)

即使将结果赋值给浮点类型,若操作数均为整数,仍会先进行整数除法:

double result = 100 / 8;  // 结果仍为 12.0

Java 浮点运算

使用 floatdouble 类型可保留小数:

double no1 = 100;
double no2 = 8;
double result = no1 / no2;  // 结果为 12.5

或直接使用字面量后缀:

double result = 100D / 8D;  // D 表示 double 类型

浮点精度问题

浮点数并非完全精确,可能存在微小误差:

double resultDbl3 = 0D;
for(int i = 0; i < 100; i++) {
    resultDbl3 += 0.01D;
}
System.out.println(resultDbl3);  // 输出 1.0000000000000007

通常这种误差可忽略,但需注意其存在。

Java Math 类

java.lang.Math 类提供高级数学函数,包括:

  • 基本函数(绝对值、最值、舍入等)
  • 指数与对数函数
  • 三角函数

基本数学函数

Math.abs()

返回参数的绝对值:

int abs1 = Math.abs(10);   // 10
int abs2 = Math.abs(-20);  // 20

Math.ceil()

向上取整(返回 double):

double ceil = Math.ceil(7.343);  // 8.0

Math.floor()

向下取整(返回 double):

double floor = Math.floor(7.343);  // 7.0

Math.floorDiv()

整数除法并向下取整(与 / 在负数时行为不同):

double result3 = Math.floorDiv(-100, 9);  // -12.0
double result4 = -100 / 9;                // -11(截断小数)

Math.min() / Math.max()

返回两数中的最小值/最大值:

int min = Math.min(10, 20);  // 10
int max = Math.max(10, 20);  // 20

Math.round()

四舍五入:

double roundedDown = Math.round(23.445);  // 23.0
double roundedUp = Math.round(23.545);    // 24.0

Math.random()

返回 [0.0, 1.0) 之间的随机数:

double random = Math.random();
double random100 = Math.random() * 100D;  // [0, 100) 的随机数

指数与对数函数

Math.exp()

e 的指定次幂:

double exp1 = Math.exp(1);  // ≈2.718
double exp2 = Math.exp(2);  // ≈7.389

Math.log() / Math.log10()

自然对数(以 e 为底)和常用对数(以 10 为底):

double log1 = Math.log(1);     // 0.0
double log10 = Math.log(10);   // ≈2.302
double log10_100 = Math.log10(100);  // 2.0

Math.pow()

幂运算:

double pow2 = Math.pow(2, 2);  // 4.0
double pow8 = Math.pow(2, 8);  // 256.0

Math.sqrt()

平方根:

double sqrt4 = Math.sqrt(4);  // 2.0
double sqrt9 = Math.sqrt(9);  // 3.0

三角函数

Math.PI

π 的近似值(double 类型)

基本三角函数(参数为弧度)

double sin = Math.sin(Math.PI);    // ≈0.0
double cos = Math.cos(Math.PI);    // ≈-1.0
double tan = Math.tan(Math.PI);    // ≈-0.0

反三角函数(返回弧度)

double asin = Math.asin(1.0);  // π/2 ≈1.57
double acos = Math.acos(1.0);  // 0.0
double atan = Math.atan(1.0);  // π/4 ≈0.785

Math.atan2()

将直角坐标 (x, y) 转换为极坐标角度 θ

双曲函数

double sinh = Math.sinh(1.0);
double cosh = Math.cosh(1.0);
double tanh = Math.tanh(1.0);

角度转换

double degrees = Math.toDegrees(Math.PI);    // 180.0
double radians = Math.toRadians(180);        // π ≈3.14159