Appearance
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]最佳实践
使用 Math 对象的静态方法:Math 对象的方法都是静态的,不需要实例化,可以直接使用。
注意数值精度问题:由于 JavaScript 使用浮点数表示数字,可能会出现精度问题。在比较浮点数时,应该使用误差范围比较,而不是直接使用
===。使用适当的取整方法:根据具体需求选择合适的取整方法:
Math.ceil():向上取整Math.floor():向下取整Math.round():四舍五入Math.trunc():截断小数部分
生成随机数时的注意事项:
Math.random()生成的是伪随机数,不适合用于加密场景- 对于加密安全的随机数,应该使用
crypto.getRandomValues() - 生成指定范围内的随机数时,要注意边界条件
使用常量代替硬编码:使用 Math 对象提供的常量(如
Math.PI)代替硬编码的数值,提高代码的可读性和可维护性。性能考虑:对于频繁调用的数学运算,考虑缓存计算结果,避免重复计算。
处理特殊值:注意处理
NaN、Infinity和-Infinity等特殊值,避免它们在计算中导致意外的结果。使用 BigInt 处理大整数:对于超出
Number.MAX_SAFE_INTEGER的大整数,考虑使用 BigInt 类型。
总结
Math 对象是 JavaScript 中用于执行数学计算的强大工具,它提供了丰富的静态属性和方法来处理各种数学运算。了解 Math 对象的特性和用法,有助于你更有效地处理 JavaScript 中的数学计算任务。
通过合理使用 Math 对象的方法和遵循最佳实践,你可以避免常见的数学计算错误,编写更可靠的 JavaScript 代码来处理各种数学运算。