Math对象提供静态数学方法:Math.round四舍五入、Math.floor向下取整、Math.ceil向上取整、Math.trunc截断小数、Math.pow或**求幂、Math.sqrt开方、Math.abs取绝对值、Math.max/min找极值;注意类型转换、边界行为及浮点精度问题。

JavaScript 数学计算直接用 Math 对象,它不是构造函数,所有方法和属性都是静态的,不能 new,也不能挂实例方法。
常用 Math 函数有哪些?对应什么场景?
这些是日常开发中最高频、最不容易记混的几个:
-
Math.round(x):四舍五入到最近整数(Math.round(2.5) === 3,注意 0.5 向上取) -
Math.floor(x):向下取整(Math.floor(-2.7) === -3,负数也要小心) -
Math.ceil(x):向上取整(Math.ceil(-2.1) === -2) -
Math.trunc(x):直接截断小数部分(Math.trunc(-2.9) === -2,不四舍五入也不进位) -
Math.pow(base, exp)或更推荐base ** exp(ES2016+),比如Math.pow(2, 3) === 8 -
Math.sqrt(x):开平方,Math.sqrt(-1)返回NaN(不是报错) -
Math.abs(x):绝对值,对NaN返回NaN,对null会先转成0 -
Math.max(...arr)和Math.min(...arr):找数组最大/最小值,注意要展开(Math.max([1,2,3])是错的,得写Math.max(...[1,2,3]))
容易踩坑的 Math 行为
很多“看似合理”的写法实际结果反直觉,尤其涉及类型转换和边界值:
-
Math.floor和Math.ceil对NaN、undefined、非数字字符串(如"abc")都返回NaN;但对空字符串""、null、false会先转成0 -
Math.random()返回的是[0, 1)区间(包含 0,不包含 1),想生成[1, 10]整数得写Math.floor(Math.random() * 10) + 1 -
Math.sin/Math.cos等三角函数单位是弧度,不是角度 —— 想算 30° 的正弦得写Math.sin(30 * Math.PI / 180) -
Math.log(x)是自然对数(以e为底),不是以 10 为底;要算常用对数得用Math.log10(x)(ES2015+),兼容性差时可写Math.log(x) / Math.LN10
精度问题怎么绕?别信 parseFloat 或 Number 直接算
JavaScript 使用 IEEE 754 双精度浮点数,0.1 + 0.2 !== 0.3 是经典表现。Math 本身不解决这个问题,但你可以用这些方式缓解:
立即学习“Java免费学习笔记(深入)”;
- 业务上允许误差时,用
Number((a + b).toFixed(10))截断(注意toFixed返回字符串) - 做金额计算时,统一转成整数分再运算:
const cents = Math.round(dollars * 100) - 需要高精度时引入库如
decimal.js,而不是自己封装Math方法 -
Math.fround(x)可模拟 32 位浮点行为(极少用),但不会改善精度,只是控制舍入方式
console.log(0.1 + 0.2); // 0.30000000000000004 console.log(Number((0.1 + 0.2).toFixed(1))); // 0.3 console.log(Math.round(123.456 * 100) / 100); // 123.46
真正麻烦的不是记不住函数名,而是忘了 Math 不处理类型校验、不抛错、对无效输入静默返回 NaN —— 这个特性在链式计算里很容易埋雷,比如 Math.sqrt(input) * 2,一旦 input 是负数或空字符串,后面整个表达式就变成 NaN 了。











