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;
计算顺序:
100 * 100 = 1000010000 / 5 = 2000200 * 3 = 600600 / 2 = 3002000 + 300 = 2300
使用括号可改变优先级:
int result = 100 * 100 / (5 + 200) * 3 / 2; // 结果为 72
Java 整数运算
Java 整数类型(byte、short、int、long)的运算会截断小数部分:
int result = 100 / 8; // 结果为 12(而非 12.5)
即使将结果赋值给浮点类型,若操作数均为整数,仍会先进行整数除法:
double result = 100 / 8; // 结果仍为 12.0
Java 浮点运算
使用 float 或 double 类型可保留小数:
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