Skip to content

JavaScript Math(算数)

什么是 Math 对象

Math 对象是 JavaScript 中用于执行数学计算的内置对象。它提供了一系列静态属性和方法,用于处理各种数学运算,如三角函数、对数、随机数生成等。

Math 对象不需要实例化,可以直接使用其静态属性和方法。

Math 对象的属性

Math 对象提供了以下常用静态属性:

javascript
// 数学常量
console.log(Math.PI); // π (约 3.14159)
console.log(Math.E); // 自然对数的底数 e (约 2.71828)
console.log(Math.LN2); // 2 的自然对数 (约 0.69314)
console.log(Math.LN10); // 10 的自然对数 (约 2.30258)
console.log(Math.LOG2E); // 以 2 为底的 e 的对数 (约 1.44269)
console.log(Math.LOG10E); // 以 10 为底的 e 的对数 (约 0.43429)
console.log(Math.SQRT2); // 2 的平方根 (约 1.41421)
console.log(Math.SQRT1_2); // 1/2 的平方根 (约 0.70710)

Math 对象的方法

基本运算

javascript
// 绝对值
console.log(Math.abs(-5)); // 5
console.log(Math.abs(5)); // 5

// 最大值
console.log(Math.max(1, 2, 3)); // 3
console.log(Math.max(...[1, 2, 3])); // 3

// 最小值
console.log(Math.min(1, 2, 3)); // 1
console.log(Math.min(...[1, 2, 3])); // 1

// 幂运算
console.log(Math.pow(2, 3)); // 8 (2^3)

// 平方根
console.log(Math.sqrt(9)); // 3

// 立方根
console.log(Math.cbrt(8)); // 2

// 平方
console.log(Math.pow(4, 2)); // 16

// 倒数
console.log(1 / Math.pow(2, 1)); // 0.5

对数运算

javascript
// 自然对数 (以 e 为底)
console.log(Math.log(Math.E)); // 1

// 以 10 为底的对数
console.log(Math.log10(100)); // 2

// 以 2 为底的对数
console.log(Math.log2(8)); // 3

// 指数运算 (e^x)
console.log(Math.exp(1)); // e (约 2.71828)

// exp(x) - 1
console.log(Math.expm1(0)); // 0 (e^0 - 1 = 0)

三角函数

javascript
// 角度转弧度
function toRadians(degrees) {
  return degrees * (Math.PI / 180);
}

// 弧度转角度
function toDegrees(radians) {
  return radians * (180 / Math.PI);
}

// 正弦
console.log(Math.sin(toRadians(0))); // 0
console.log(Math.sin(toRadians(30))); // 0.5
console.log(Math.sin(toRadians(90))); // 1

// 余弦
console.log(Math.cos(toRadians(0))); // 1
console.log(Math.cos(toRadians(60))); // 0.5
console.log(Math.cos(toRadians(90))); // 0

// 正切
console.log(Math.tan(toRadians(0))); // 0
console.log(Math.tan(toRadians(45))); // 1

// 反正弦
console.log(toDegrees(Math.asin(0))); // 0
console.log(toDegrees(Math.asin(1))); // 90

// 反余弦
console.log(toDegrees(Math.acos(1))); // 0
console.log(toDegrees(Math.acos(0))); // 90

// 反正切
console.log(toDegrees(Math.atan(0))); // 0
console.log(toDegrees(Math.atan(1))); // 45

// 反正切2 (y, x)
console.log(toDegrees(Math.atan2(1, 1))); // 45

取整方法

javascript
// 向上取整
console.log(Math.ceil(1.2)); // 2
console.log(Math.ceil(-1.2)); // -1

// 向下取整
console.log(Math.floor(1.8)); // 1
console.log(Math.floor(-1.8)); // -2

// 四舍五入
console.log(Math.round(1.4)); // 1
console.log(Math.round(1.5)); // 2
console.log(Math.round(-1.4)); // -1
console.log(Math.round(-1.5)); // -1 (注意:负数的四舍五入)

// 截断小数部分(向零取整)
console.log(Math.trunc(1.8)); // 1
console.log(Math.trunc(-1.8)); // -1

随机数生成

javascript
// 生成 0 到 1 之间的随机数 (包括 0,不包括 1)
console.log(Math.random());

// 生成指定范围内的随机整数
function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

console.log(getRandomInt(1, 10)); // 1 到 10 之间的随机整数

// 生成指定范围内的随机浮点数
function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

console.log(getRandomFloat(1, 10)); // 1 到 10 之间的随机浮点数

符号函数

javascript
// 符号函数:返回数字的符号
console.log(Math.sign(5)); // 1
console.log(Math.sign(-5)); // -1
console.log(Math.sign(0)); // 0
console.log(Math.sign(-0)); // -0
console.log(Math.sign(NaN)); // NaN

其他方法

javascript
// 双曲正弦
console.log(Math.sinh(0)); // 0

// 双曲余弦
console.log(Math.cosh(0)); // 1

// 双曲正切
console.log(Math.tanh(0)); // 0

// 指数函数和对数函数的组合
console.log(Math.hypot(3, 4)); // 5 (勾股定理: √(3² + 4²))

// 剩余运算
console.log(Math.fround(1.5)); // 1.5 (返回最接近的单精度浮点数)

// 确定数字的奇偶性
function isEven(num) {
  return num % 2 === 0;
}

function isOdd(num) {
  return num % 2 !== 0;
}

console.log(isEven(4)); // true
console.log(isOdd(5)); // true

数值范围和精度

数值范围

JavaScript 中的数字使用 IEEE 754 双精度浮点数表示,有一定的范围限制:

javascript
// 最大安全整数
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991

// 最小安全整数
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991

// 最大数值
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308

// 最小数值
console.log(Number.MIN_VALUE); // 5e-324

精度问题

由于 JavaScript 使用浮点数表示数字,可能会出现精度问题:

javascript
// 精度问题示例
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

// 解决方法:使用误差范围比较
function areEqual(a, b, epsilon = 1e-10) {
  return Math.abs(a - b) < epsilon;
}

console.log(areEqual(0.1 + 0.2, 0.3)); // true

// 或者使用 BigInt
console.log((1n + 2n) / 10n); // 0n (注意:BigInt 除法是整数除法)

// 或者使用字符串操作库(如 decimal.js)

数学常量的使用

javascript
// 使用 Math.PI 计算圆的面积
function calculateCircleArea(radius) {
  return Math.PI * Math.pow(radius, 2);
}

console.log(calculateCircleArea(5)); // 约 78.53981633974483

// 使用 Math.E 计算连续复利
function calculateCompoundInterest(principal, rate, time) {
  return principal * Math.pow(Math.E, rate * time);
}

// 本金 1000,年利率 5%,时间 1 年
console.log(calculateCompoundInterest(1000, 0.05, 1)); // 约 1051.27

随机数生成的应用

随机密码生成

javascript
function generateRandomPassword(length = 8) {
  const charset =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";
  let password = "";
  for (let i = 0; i < length; i++) {
    const randomIndex = Math.floor(Math.random() * charset.length);
    password += charset[randomIndex];
  }
  return password;
}

console.log(generateRandomPassword()); // 例如:'X7$pQ2@Z'
console.log(generateRandomPassword(12)); // 例如:'A3#bC5*dE7$f'

随机颜色生成

javascript
function generateRandomColor() {
  const r = Math.floor(Math.random() * 256);
  const g = Math.floor(Math.random() * 256);
  const b = Math.floor(Math.random() * 256);
  return `rgb(${r}, ${g}, ${b})`;
}

console.log(generateRandomColor()); // 例如:'rgb(123, 45, 67)'

// 生成十六进制颜色
function generateRandomHexColor() {
  const hex = Math.floor(Math.random() * 16777216).toString(16);
  return `#${hex.padStart(6, "0")}`;
}

console.log(generateRandomHexColor()); // 例如:'#1a2b3c'

洗牌算法

javascript
function shuffleArray(array) {
  const newArray = [...array];
  for (let i = newArray.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [newArray[i], newArray[j]] = [newArray[j], newArray[i]];
  }
  return newArray;
}

const numbers = [1, 2, 3, 4, 5];
console.log(shuffleArray(numbers)); // 例如:[3, 1, 5, 2, 4]

最佳实践

  1. 使用 Math 对象的静态方法:Math 对象的方法都是静态的,不需要实例化,可以直接使用。

  2. 注意数值精度问题:由于 JavaScript 使用浮点数表示数字,可能会出现精度问题。在比较浮点数时,应该使用误差范围比较,而不是直接使用 ===

  3. 使用适当的取整方法:根据具体需求选择合适的取整方法:

    • Math.ceil():向上取整
    • Math.floor():向下取整
    • Math.round():四舍五入
    • Math.trunc():截断小数部分
  4. 生成随机数时的注意事项

    • Math.random() 生成的是伪随机数,不适合用于加密场景
    • 对于加密安全的随机数,应该使用 crypto.getRandomValues()
    • 生成指定范围内的随机数时,要注意边界条件
  5. 使用常量代替硬编码:使用 Math 对象提供的常量(如 Math.PI)代替硬编码的数值,提高代码的可读性和可维护性。

  6. 性能考虑:对于频繁调用的数学运算,考虑缓存计算结果,避免重复计算。

  7. 处理特殊值:注意处理 NaNInfinity-Infinity 等特殊值,避免它们在计算中导致意外的结果。

  8. 使用 BigInt 处理大整数:对于超出 Number.MAX_SAFE_INTEGER 的大整数,考虑使用 BigInt 类型。

总结

Math 对象是 JavaScript 中用于执行数学计算的强大工具,它提供了丰富的静态属性和方法来处理各种数学运算。了解 Math 对象的特性和用法,有助于你更有效地处理 JavaScript 中的数学计算任务。

通过合理使用 Math 对象的方法和遵循最佳实践,你可以避免常见的数学计算错误,编写更可靠的 JavaScript 代码来处理各种数学运算。