算术运算符 #
一、运算符概述 #
算术运算符用于执行数学运算,包括加、减、乘、除、取余、幂运算等。
二、基本算术运算符 #
2.1 加法运算符(+) #
typescript
const a = 10;
const b = 5;
console.log(a + b); // 15
// 字符串拼接
const str1 = "Hello, ";
const str2 = "Deno!";
console.log(str1 + str2); // "Hello, Deno!"
// 数字与字符串
console.log(10 + "20"); // "1020" (字符串拼接)
console.log("10" + 20); // "1020" (字符串拼接)
2.2 减法运算符(-) #
typescript
const a = 10;
const b = 5;
console.log(a - b); // 5
console.log(a - 3); // 7
// 字符串转数字后相减
console.log("10" - 5); // 5
console.log("10" - "5"); // 5
2.3 乘法运算符(*) #
typescript
const a = 10;
const b = 5;
console.log(a * b); // 50
console.log(a * 3); // 30
// 字符串转数字后相乘
console.log("10" * 5); // 50
console.log("10" * "5"); // 50
2.4 除法运算符(/) #
typescript
const a = 10;
const b = 5;
console.log(a / b); // 2
console.log(10 / 3); // 3.3333333333333335
// 除以零
console.log(10 / 0); // Infinity
console.log(-10 / 0); // -Infinity
console.log(0 / 0); // NaN
// 字符串转数字后相除
console.log("10" / 5); // 2
2.5 取余运算符(%) #
typescript
console.log(10 % 3); // 1
console.log(10 % 5); // 0
console.log(10 % 7); // 3
// 负数取余
console.log(-10 % 3); // -1
console.log(10 % -3); // 1
// 判断奇偶
const isEven = (n: number) => n % 2 === 0;
const isOdd = (n: number) => n % 2 !== 0;
console.log(isEven(4)); // true
console.log(isOdd(5)); // true
2.6 幂运算符(**) #
typescript
console.log(2 ** 3); // 8
console.log(2 ** 10); // 1024
console.log(3 ** 2); // 9
console.log(10 ** 3); // 1000
// 负数幂
console.log((-2) ** 3); // -8
console.log(2 ** -2); // 0.25
// 小数幂
console.log(4 ** 0.5); // 2 (平方根)
console.log(8 ** (1/3)); // 2 (立方根)
三、一元运算符 #
3.1 一元加号(+) #
将操作数转换为数字:
typescript
console.log(+10); // 10
console.log(+"10"); // 10
console.log(+"3.14"); // 3.14
console.log(+true); // 1
console.log(+false); // 0
console.log(+null); // 0
console.log(+undefined); // NaN
console.log(+"hello"); // NaN
3.2 一元减号(-) #
将操作数转换为数字并取反:
typescript
console.log(-10); // -10
console.log(-"10"); // -10
console.log(-true); // -1
console.log(-false); // 0
console.log(-null); // -0
console.log(-undefined); // NaN
3.3 自增运算符(++) #
typescript
let a = 5;
// 前置自增:先加1,再使用
console.log(++a); // 6
console.log(a); // 6
// 后置自增:先使用,再加1
let b = 5;
console.log(b++); // 5
console.log(b); // 6
// 在表达式中
let x = 10;
let y = ++x + 5;
console.log(x, y); // 11, 16
let m = 10;
let n = m++ + 5;
console.log(m, n); // 11, 15
3.4 自减运算符(–) #
typescript
let a = 5;
// 前置自减:先减1,再使用
console.log(--a); // 4
console.log(a); // 4
// 后置自减:先使用,再减1
let b = 5;
console.log(b--); // 5
console.log(b); // 4
四、赋值运算符 #
4.1 基本赋值 #
typescript
let a = 10;
console.log(a); // 10
4.2 复合赋值运算符 #
typescript
let a = 10;
// 加法赋值
a += 5; // a = a + 5
console.log(a); // 15
// 减法赋值
a -= 3; // a = a - 3
console.log(a); // 12
// 乘法赋值
a *= 2; // a = a * 2
console.log(a); // 24
// 除法赋值
a /= 4; // a = a / 4
console.log(a); // 6
// 取余赋值
a %= 4; // a = a % 4
console.log(a); // 2
// 幂赋值
a **= 3; // a = a ** 3
console.log(a); // 8
五、运算符优先级 #
5.1 优先级表 #
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1 | () | 分组 |
| 2 | ++ – | 后置自增/自减 |
| 3 | ++ – + - | 前置自增/自减、一元加/减 |
| 4 | ** | 幂运算 |
| 5 | * / % | 乘、除、取余 |
| 6 | + - | 加、减 |
| 7 | = += -= *= /= %= **= | 赋值 |
5.2 优先级示例 #
typescript
console.log(2 + 3 * 4); // 14 (先乘后加)
console.log((2 + 3) * 4); // 20 (括号优先)
console.log(2 ** 3 ** 2); // 512 (幂运算从右到左)
console.log((2 ** 3) ** 2); // 64
console.log(10 + 2 * 3 - 4 / 2); // 14
// 计算顺序:2*3=6, 4/2=2, 10+6=16, 16-2=14
六、Math对象方法 #
6.1 取整方法 #
typescript
const num = 3.7;
// 向下取整
console.log(Math.floor(num)); // 3
console.log(Math.floor(-3.7)); // -4
// 向上取整
console.log(Math.ceil(num)); // 4
console.log(Math.ceil(-3.7)); // -3
// 四舍五入
console.log(Math.round(3.4)); // 3
console.log(Math.round(3.5)); // 4
console.log(Math.round(-3.5)); // -3
// 截断小数
console.log(Math.trunc(3.7)); // 3
console.log(Math.trunc(-3.7)); // -3
6.2 数学函数 #
typescript
// 绝对值
console.log(Math.abs(-5)); // 5
// 最大值和最小值
console.log(Math.max(1, 2, 3)); // 3
console.log(Math.min(1, 2, 3)); // 1
// 幂和根
console.log(Math.pow(2, 10)); // 1024
console.log(Math.sqrt(16)); // 4
console.log(Math.cbrt(27)); // 3
// 三角函数
console.log(Math.sin(Math.PI / 2)); // 1
console.log(Math.cos(0)); // 1
console.log(Math.tan(Math.PI / 4)); // 1
// 对数
console.log(Math.log(Math.E)); // 1
console.log(Math.log10(100)); // 2
console.log(Math.log2(8)); // 3
6.3 随机数 #
typescript
// 0-1之间的随机数
console.log(Math.random());
// 指定范围的随机整数
function randomInt(min: number, max: number): number {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(randomInt(1, 100)); // 1-100之间的随机整数
// 随机数组元素
const items = ["a", "b", "c", "d", "e"];
const randomItem = items[Math.floor(Math.random() * items.length)];
console.log(randomItem);
七、精度问题 #
7.1 浮点数精度 #
typescript
// 经典的浮点数精度问题
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
// 解决方案1:使用toFixed
console.log((0.1 + 0.2).toFixed(2)); // "0.30"
console.log(parseFloat((0.1 + 0.2).toFixed(2))); // 0.3
// 解决方案2:乘以倍数
console.log((0.1 * 100 + 0.2 * 100) / 100); // 0.3
// 解决方案3:使用Number.EPSILON
function isEqual(a: number, b: number): boolean {
return Math.abs(a - b) < Number.EPSILON;
}
console.log(isEqual(0.1 + 0.2, 0.3)); // true
7.2 大数精度 #
typescript
// 大数精度问题
console.log(9999999999999999); // 10000000000000000
// 使用BigInt
const bigNum = 9999999999999999n;
console.log(bigNum); // 9999999999999999n
// BigInt运算
const a = 9007199254740991n;
const b = 1n;
console.log(a + b); // 9007199254740992n
八、实际应用 #
8.1 计算器函数 #
typescript
function calculate(a: number, b: number, operator: string): number | string {
switch (operator) {
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
case "/":
return b !== 0 ? a / b : "除数不能为0";
case "%":
return a % b;
case "**":
return a ** b;
default:
return "未知运算符";
}
}
console.log(calculate(10, 5, "+")); // 15
console.log(calculate(10, 5, "/")); // 2
console.log(calculate(2, 10, "**")); // 1024
8.2 数字格式化 #
typescript
// 格式化货币
function formatCurrency(amount: number): string {
return "¥" + amount.toFixed(2);
}
console.log(formatCurrency(1234.5)); // "¥1234.50"
// 千位分隔符
function formatNumber(num: number): string {
return num.toLocaleString("zh-CN");
}
console.log(formatNumber(1234567)); // "1,234,567"
// 科学计数法
function formatScientific(num: number): string {
return num.toExponential(2);
}
console.log(formatScientific(123456)); // "1.23e+5"
8.3 范围检查 #
typescript
function inRange(value: number, min: number, max: number): boolean {
return value >= min && value <= max;
}
console.log(inRange(5, 1, 10)); // true
console.log(inRange(0, 1, 10)); // false
// 限制范围
function clamp(value: number, min: number, max: number): number {
return Math.min(Math.max(value, min), max);
}
console.log(clamp(5, 0, 10)); // 5
console.log(clamp(-5, 0, 10)); // 0
console.log(clamp(15, 0, 10)); // 10
九、总结 #
本章学习了:
- 基本算术运算符:+、-、*、/、%、**
- 一元运算符:+、-、++、–
- 复合赋值运算符:+=、-=、*=、/=、%=、**=
- 运算符优先级
- Math对象方法
- 浮点数精度问题
- 实际应用场景
下一章,我们将学习比较运算符。
最后更新:2026-03-28