Math对象提供静态数学方法:Math.round四舍五入、Math.floor向下取整、Math.ceil向上取整、Math.trunc截断小数、Math.pow或**求幂、Math.sqrt开方、Math.abs取绝对值、Math.max/min找极值;注意类型转换、边界行为及浮点精度问题。
JavaScript 数学计算直接用 Math 对象,它不是构造函数,所有方法和属性都是静态的,不能 new,也不能挂实例方法。
这些是日常开发中最高频、最不容易记混的几个:
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.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
JavaScript 使用 IEEE 754 双精度浮点数,0.1 + 0.2 !== 0.3 是经典表现。Math 本身不解决这个问题,但你可以用这些方式缓解:
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 了。