跳到主要内容
前端 math.js 快速上手入门教程 | 极客日志
JavaScript 大前端 算法
前端 math.js 快速上手入门教程 JavaScript 数学库 math.js 提供高精度计算、矩阵运算、复数处理及表达式解析功能。内容涵盖安装配置、基础与高级运算示例,对比原生 JS 精度差异,详解常见使用陷阱如类型混淆与性能优化,并包含单元测试建议与最佳实践指南,帮助开发者高效进行数值计算。
古灵精怪 发布于 2026/2/9 更新于 2026/5/26 22 浏览math.js 快速上手入门教程
学习目标
理解 math.js 的基本概念和用途
掌握 math.js 的安装与配置
学会使用 math.js 进行基本数学运算
熟悉 math.js 的高级功能:矩阵、复数、表达式解析等
避免常见的 math.js 使用陷阱
编写单元测试确保代码正确性
1. 引言:math.js 是什么?
1.1 基本介绍
math.js 是一个强大的 JavaScript 数学库,它提供了丰富的数学函数、数据类型(如矩阵、复数)和表达式解析器。与原生 JavaScript 相比,math.js 提供了更精确的计算能力和更丰富的数学功能。
1.2 为什么选择 math.js?
特性 原生 JavaScript math.js 精度 受限于浮点数精度 高精度计算支持 数据类型 基本数值类型 矩阵、复数、分数等 功能 基础数学运算 丰富的数学函数库 表达式解析 不支持 内置表达式解析器
2. 安装与配置
2.1 npm 安装
npm install mathjs
2.2 CDN 引入
<script src ="https://cdnjs.cloudflare.com/ajax/libs/mathjs/11.7.0/math.min.js" > </script >
2.3 ES6 模块导入
import * as math from 'mathjs' ;
3. 基础数学运算
3.1 基本运算
const result1 = math.add (2 , 3 );
const result2 = math. ( , );
result3 = math. ( , );
result4 = math. ( , );
subtract
5
2
const
multiply
4
3
const
divide
10
2
3.2 高精度运算
const preciseResult = math.evaluate ('0.1 + 0.2' );
3.3 常用数学函数 函数 说明 示例 math.sqrt(x)平方根 math.sqrt(16) → 4math.pow(x, y)幂运算 math.pow(2, 3) → 8math.sin(x)正弦函数 math.sin(math.pi / 2) → 1math.log(x)自然对数 math.log(math.e) → 1
4. 矩阵运算
4.1 创建矩阵
const matrixA = math.matrix ([[1 , 2 ], [3 , 4 ]]);
const matrixB = math.matrix ([[5 , 6 ], [7 , 8 ]]);
4.2 矩阵运算
const matrixSum = math.add (matrixA, matrixB);
console .log (math.format (matrixSum));
const matrixProduct = math.multiply (matrixA, matrixB);
console .log (math.format (matrixProduct));
4.3 矩阵操作 操作 说明 示例 math.transpose(matrix)转置矩阵 math.transpose([[1, 2], [3, 4]]) → [[1, 3], [2, 4]]math.det(matrix)计算行列式 math.det([[1, 2], [3, 4]]) → -2math.inv(matrix)计算逆矩阵 math.inv([[1, 2], [3, 4]]) → [[-2, 1], [1.5, -0.5]]
5. 复数运算
5.1 创建复数
const complex1 = math.complex (3 , 4 );
const complex2 = math.complex ('2 + 5i' );
5.2 复数运算
const complexSum = math.add (complex1, complex2);
console .log (math.format (complexSum));
const complexProduct = math.multiply (complex1, complex2);
console .log (math.format (complexProduct));
5.3 复数属性 属性 说明 示例 re实部 complex1.re → 3im虚部 complex1.im → 4abs()模长 complex1.abs() → 5
6. 表达式解析
6.1 基本表达式解析
const result = math.evaluate ('sqrt(3^2 + 4^2)' );
console .log (result);
const scope = { x : 2 , y : 3 };
const result2 = math.evaluate ('x^2 + y^2' , scope);
console .log (result2);
6.2 函数定义
math.evaluate ('f(x) = x^2 + 2*x + 1' );
const result3 = math.evaluate ('f(3)' );
console .log (result3);
6.3 表达式编译
const expr = math.compile ('x^2 + 2*x + 1' );
const result4 = expr.evaluate ({ x : 3 });
console .log (result4);
7. 绘图与可视化 虽然 math.js 本身不提供绘图功能,但它可以与绘图库(如 Chart.js)结合使用:
const xValues = math.range (-10 , 10 , 0.1 ).toArray ();
const yValues = xValues.map (x => math.evaluate ('x^2' , { x }));
结合 Three.js 等 3D 库可以实现更复杂的可视化:
const data = [];
for (let x = -5 ; x <= 5 ; x += 0.5 ) {
for (let y = -5 ; y <= 5 ; y += 0.5 ) {
const z = math.evaluate ('sin(sqrt(x^2 + y^2))' , { x, y });
data.push ([x, y, z]);
}
}
8. 单元测试
8.1 测试框架集成
const math = require ('mathjs' );
test ('addition works correctly' , () => {
expect (math.add (2 , 3 )).toBe (5 );
});
test ('matrix multiplication works correctly' , () => {
const A = math.matrix ([[1 , 2 ], [3 , 4 ]]);
const B = math.matrix ([[5 , 6 ], [7 , 8 ]]);
const result = math.multiply (A, B);
const expected = math.matrix ([[19 , 22 ], [43 , 50 ]]);
expect (math.deepEqual (result, expected)).toBe (true );
});
8.2 边界条件测试 test ('division by zero throws error' , () => {
expect (() => math.divide (1 , 0 )).toThrow ();
});
test ('sqrt of negative number returns complex' , () => {
const result = math.sqrt (-4 );
expect (result).toBeInstanceOf (math.Complex );
expect (result.re ).toBe (0 );
expect (result.im ).toBe (2 );
});
9. 常见踩坑与解决方案
9.1 精度问题 问题 :以为用了 math.js 就不会有精度问题
解决方案 :使用 math.bignumber 进行高精度计算
const result1 = math.evaluate ('0.1 + 0.2' );
const result2 = math.add (math.bignumber (0.1 ), math.bignumber (0.2 ));
9.2 类型混淆 问题 :JavaScript Number 与 math.js 类型混用
解决方案 :统一使用 math.js 类型
const result1 = math.add (0.1 , math.bignumber (0.2 ));
const result2 = math.add (math.bignumber (0.1 ), math.bignumber (0.2 ));
9.3 矩阵索引 问题 :忘记 math.js 矩阵索引从 0 开始
解决方案 :注意索引范围
const matrix = math.matrix ([[1 , 2 ], [3 , 4 ]]);
const value = matrix.get ([1 , 1 ]);
const value = matrix.get ([0 , 0 ]);
9.4 表达式作用域 问题 :表达式中变量未定义
解决方案 :正确传递作用域
const result = math.evaluate ('x + y' );
const scope = { x : 1 , y : 2 };
const result = math.evaluate ('x + y' , scope);
9.5 函数覆盖 问题 :自定义函数覆盖了内置函数
解决方案 :避免使用内置函数名
math.evaluate ('sin(x) = x^2' );
math.evaluate ('mysin(x) = x^2' );
9.6 异步操作 问题 :在异步操作中使用 math.js
解决方案 :确保在正确上下文中使用
setTimeout (() => {
const result = math.add (1 , 2 );
}, 1000 );
setTimeout (() => {
const math = require ('mathjs' );
const result = math.add (1 , 2 );
}, 1000 );
9.7 内存泄漏 问题 :大量创建 math.js 对象未释放
解决方案 :合理管理对象生命周期
for (let i = 0 ; i < 1000000 ; i++) {
const matrix = math.matrix ([...]);
}
9.8 性能问题 问题 :频繁使用 math.evaluate
解决方案 :使用 math.compile 预编译表达式
for (let i = 0 ; i < 10000 ; i++) {
const result = math.evaluate ('x^2 + 2*x + 1' , { x : i });
}
const expr = math.compile ('x^2 + 2*x + 1' );
for (let i = 0 ; i < 10000 ; i++) {
const result = expr.evaluate ({ x : i });
}
9.9 单位混淆 问题 :角度单位混淆(度 vs 弧度)
解决方案 :明确指定单位
const result1 = math.sin (90 );
const result2 = math.sin (math.unit (90 , 'deg' ));
9.10 导入方式错误 问题 :导入方式不正确导致功能缺失
解决方案 :使用正确的导入方式
import math from 'mathjs' ;
import * as math from 'mathjs' ;
10. 功能对比表格 功能类别 原生 JavaScript math.js 优势 基本运算 ✅ 支持 ✅ 支持 math.js 精度更高 高精度计算 ❌ 不支持 ✅ 支持 BigNumber math.js 支持任意精度 矩阵运算 ❌ 不支持 ✅ 完整支持 math.js 提供完整矩阵库 复数运算 ❌ 不支持 ✅ 完整支持 math.js 内置复数类型 表达式解析 ❌ 不支持 ✅ 强大解析器 math.js 支持复杂表达式 单位转换 ❌ 不支持 ✅ 支持多种单位 math.js 内置单位系统 统计函数 ❌ 基础支持 ✅ 丰富函数库 math.js 提供更多统计函数 微积分 ❌ 不支持 ✅ 支持符号计算 math.js 支持导数、积分 分数运算 ❌ 不支持 ✅ 支持分数类型 math.js 保持分数精度 性能优化 ❌ 无优化 ✅ 表达式编译 math.js 支持预编译优化
11. 算法步骤思路详解
11.1 表达式求值算法
词法分析 :将表达式字符串分解为标记(tokens)
语法分析 :构建抽象语法树(AST)
语义分析 :检查类型和作用域
优化 :对 AST 进行优化
执行 :遍历 AST 计算结果
11.2 矩阵乘法算法
维度检查 :确保矩阵可以相乘
初始化结果矩阵 :创建适当大小的结果矩阵
三重循环计算 :
外层循环遍历结果矩阵行
中层循环遍历结果矩阵列
内层循环计算点积
返回结果
function multiplyMatrix (A, B ) {
if (A.columns !== B.rows ) throw new Error ('矩阵维度不匹配' );
const result = createMatrix (A.rows , B.columns );
for (let i = 0 ; i < A.rows ; i++) {
for (let j = 0 ; j < B.columns ; j++) {
let sum = 0 ;
for (let k = 0 ; k < A.columns ; k++) {
sum += A.get ([i, k]) * B.get ([k, j]);
}
result.set ([i, j], sum);
}
}
return result;
}
11.3 数值积分算法(梯形法则)
区间分割 :将积分区间 [a,b] 分割为 n 个子区间
计算节点值 :在每个节点处计算函数值
应用梯形公式 :对每个子区间应用梯形公式
求和 :将所有子区间的积分值相加
function trapezoidalRule (func, a, b, n ) {
const h = (b - a) / n;
let sum = (func (a) + func (b)) / 2 ;
for (let i = 1 ; i < n; i++) {
sum += func (a + i * h);
}
return sum * h;
}
12. 总结与最佳实践
12.1 核心要点回顾
精度优先 :始终使用 math.js 的高精度计算功能
类型一致 :避免混用 JavaScript 原生类型和 math.js 类型
性能优化 :对于重复计算,使用 math.compile 预编译表达式
错误处理 :妥善处理边界条件和异常情况
单元测试 :为数学计算编写充分的测试用例
12.2 最佳实践清单 实践项目 说明 ✅ 使用 math.bignumber 处理需要高精度的计算 ✅ 预编译表达式 对于重复使用的表达式使用 math.compile ✅ 明确单位 使用 math.unit 处理物理量计算 ✅ 类型检查 在关键位置添加类型检查 ✅ 异常处理 使用 try-catch 处理可能的计算错误 ✅ 内存管理 及时释放不再使用的大型对象 ✅ 文档注释 为复杂的数学计算添加详细注释 ✅ 单元测试 为所有数学函数编写测试用例
12.3 未来学习方向
深入学习线性代数 :掌握更高级的矩阵运算
数值分析 :了解数值计算的稳定性和收敛性
符号计算 :探索 math.js 的符号计算功能
性能调优 :学习如何优化大规模数学计算
可视化应用 :结合图形库创建数学可视化应用
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
JavaScript 压缩与混淆 Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online