算术运算符 #

一、运算符概述 #

算术运算符用于执行数学运算,包括加、减、乘、除、取余、幂运算等。

二、基本算术运算符 #

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