Skip to content

Math 对象

Math 对象是 JavaScript 的内置对象,提供了数学常数和数学函数的属性和方法。与其它全局对象不同,Math 不是一个构造函数,它的所有属性和方法都是静态的,直接通过 Math 对象调用。

Math 常数

Math 对象提供了一些常用的数学常数:

javascript
console.log(Math.E);        // 2.718281828459045 (自然对数的底数)
console.log(Math.PI);       // 3.141592653589793 (圆周率)
console.log(Math.SQRT2);    // 1.4142135623730951 (2 的平方根)
console.log(Math.SQRT1_2);  // 0.7071067811865476 (1/2 的平方根)
console.log(Math.LN2);      // 0.6931471805599453 (2 的自然对数)
console.log(Math.LN10);     // 2.302585092994046 (10 的自然对数)
console.log(Math.LOG2E);    // 1.4426950408889634 (以 2 为底 E 的对数)
console.log(Math.LOG10E);   // 0.4342944819032518 (以 10 为底 E 的对数)

基本数学函数

绝对值、向上取整、向下取整、四舍五入

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

// 向上取整
console.log(Math.ceil(4.2));   // 5
console.log(Math.ceil(-4.7));  // -4

// 向下取整
console.log(Math.floor(4.7));  // 4
console.log(Math.floor(-4.2)); // -5

// 四舍五入
console.log(Math.round(4.4));  // 4
console.log(Math.round(4.5));  // 5
console.log(Math.round(-4.5)); // -4

// 截断小数部分
console.log(Math.trunc(4.7));  // 4
console.log(Math.trunc(-4.7)); // -4

最大值和最小值

javascript
console.log(Math.max(1, 5, 3, 9, 2));  // 9
console.log(Math.min(1, 5, 3, 9, 2));  // 1

// 对于数组,需要使用扩展运算符
let numbers = [1, 5, 3, 9, 2];
console.log(Math.max(...numbers));     // 9
console.log(Math.min(...numbers));     // 1

幂运算和平方根

javascript
// 幂运算
console.log(Math.pow(2, 3));   // 8 (2 的 3 次方)
console.log(Math.pow(4, 0.5)); // 2 (4 的平方根)

// 平方根
console.log(Math.sqrt(16));    // 4
console.log(Math.sqrt(2));     // 1.4142135623730951

// 立方根
console.log(Math.cbrt(27));    // 3

// 对数
console.log(Math.log(Math.E)); // 1 (自然对数)
console.log(Math.log10(100));  // 2 (以 10 为底的对数)
console.log(Math.log2(8));     // 3 (以 2 为底的对数)

三角函数

javascript
// 三角函数(参数为弧度)
console.log(Math.sin(Math.PI / 2));  // 1 (sin 90°)
console.log(Math.cos(0));            // 1 (cos 0°)
console.log(Math.tan(Math.PI / 4));  // 1 (tan 45°)

// 反三角函数
console.log(Math.asin(1));           // 1.5707963267948966 (π/2)
console.log(Math.acos(0));           // 1.5707963267948966 (π/2)
console.log(Math.atan(1));           // 0.7853981633974483 (π/4)

// atan2 函数
console.log(Math.atan2(1, 1));       // 0.7853981633974483 (π/4)

随机数生成

javascript
// 生成 0 到 1 之间的随机数
console.log(Math.random());  // 例如:0.8442154321454321

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

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

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

console.log(randomFloat(1.5, 5.5));  // 1.5 到 5.5 之间的随机浮点数

双曲函数

javascript
console.log(Math.sinh(1));  // 1.1752011936438014
console.log(Math.cosh(1));  // 1.5430806348152437
console.log(Math.tanh(1));  // 0.7615941559557649

console.log(Math.asinh(1)); // 0.881373587019543
console.log(Math.acosh(2)); // 1.3169578969248166
console.log(Math.atanh(0.5)); // 0.5493061443340548

符号函数和指数函数

javascript
// 符号函数
console.log(Math.sign(5));   // 1
console.log(Math.sign(-3));  // -1
console.log(Math.sign(0));   // 0

// 指数函数
console.log(Math.exp(1));    // 2.718281828459045 (e^1)
console.log(Math.expm1(1));  // 1.718281828459045 (e^1 - 1)

// 超越函数
console.log(Math.clz32(1000)); // 22 (32 位二进制表示中前导零的个数)

实际应用示例

角度与弧度转换

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

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

console.log(degreesToRadians(90));  // 1.5707963267948966 (π/2)
console.log(radiansToDegrees(Math.PI));  // 180

生成随机颜色

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

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

计算两点间距离

javascript
function distance(x1, y1, x2, y2) {
    let dx = x2 - x1;
    let dy = y2 - y1;
    return Math.sqrt(dx * dx + dy * dy);
}

console.log(distance(0, 0, 3, 4));  // 5

数值格式化

javascript
// 保留指定小数位数
function roundToDecimal(number, decimals) {
    let factor = Math.pow(10, decimals);
    return Math.round(number * factor) / factor;
}

console.log(roundToDecimal(3.14159, 2));  // 3.14
console.log(roundToDecimal(123.456, 1));  // 123.5

数组统计

javascript
function arrayStats(arr) {
    let sum = arr.reduce((a, b) => a + b, 0);
    let mean = sum / arr.length;
    let variance = arr.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / arr.length;
    let stdDev = Math.sqrt(variance);
    
    return {
        sum: sum,
        mean: mean,
        min: Math.min(...arr),
        max: Math.max(...arr),
        variance: variance,
        stdDev: stdDev
    };
}

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(arrayStats(numbers));

高级数学函数

超越函数应用

javascript
// 计算复利
function compoundInterest(principal, rate, time, compoundFrequency) {
    return principal * Math.pow(1 + rate / compoundFrequency, compoundFrequency * time);
}

console.log(compoundInterest(1000, 0.05, 10, 12));  // 1647.0095...

// 正态分布概率密度函数
function normalPDF(x, mean, stdDev) {
    let variance = stdDev * stdDev;
    let numerator = Math.exp(-Math.pow(x - mean, 2) / (2 * variance));
    let denominator = Math.sqrt(2 * Math.PI * variance);
    return numerator / denominator;
}

console.log(normalPDF(0, 0, 1));  // 0.3989422804014327

几何计算

javascript
// 计算圆的面积
function circleArea(radius) {
    return Math.PI * radius * radius;
}

// 计算球体体积
function sphereVolume(radius) {
    return (4/3) * Math.PI * Math.pow(radius, 3);
}

console.log(circleArea(5));      // 78.53981633974483
console.log(sphereVolume(3));    // 113.09733552923254

性能优化技巧

javascript
// 缓存常用的数学计算结果
const DEG_TO_RAD = Math.PI / 180;
const RAD_TO_DEG = 180 / Math.PI;

function fastDegreesToRadians(degrees) {
    return degrees * DEG_TO_RAD;
}

function fastRadiansToDegrees(radians) {
    return radians * RAD_TO_DEG;
}

// 预计算查找表
const SIN_TABLE = new Array(360);
for (let i = 0; i < 360; i++) {
    SIN_TABLE[i] = Math.sin(i * Math.PI / 180);
}

function fastSin(degrees) {
    return SIN_TABLE[Math.floor(degrees) % 360];
}

Math 对象提供了丰富的数学功能,是进行科学计算、图形处理、游戏开发等领域的基础工具。掌握这些数学函数的使用方法,可以帮助我们解决各种实际问题。