JavaScript 数字与 Math
JavaScript 的数字类型只有一个 number,同时提供 Math 对象来处理数学运算。
数字转换
Number() / parseInt() / parseFloat()
将字符串转为数字:
javascript
Number('42'); // 42
Number('3.14'); // 3.14
Number('42px'); // NaN(无法转换)
Number(''); // 0
Number(true); // 1
Number(false); // 0
parseInt('42'); // 42
parseInt('42px'); // 42(解析到非数字字符停止)
parseInt('3.14'); // 3(只取整数部分)
parseFloat('3.14'); // 3.14
parseFloat('3.14px'); // 3.14 区别:Number() 要求整个字符串都是合法数字,否则返回 NaN;parseInt/parseFloat 从开头解析,直到遇到非数字字符。parseInt 第二个参数指定进制:parseInt('FF', 16) → 255。
检查数值
javascript
// 是否是 NaN
Number.isNaN(NaN); // true
Number.isNaN('hello'); // false(不是 NaN,它是个字符串)
// 是否是有限数
Number.isFinite(42); // true
Number.isFinite(Infinity); // false
Number.isFinite('42'); // false(严格检查,不转换类型)
// 是否在安全整数范围内
Number.isSafeInteger(9007199254740991); // true
Number.isSafeInteger(9007199254740992); // false 不要用 isNaN() 全局函数——它会先将参数转为数字,导致 isNaN('hello') 返回 true(因为 Number('hello') 是 NaN)。始终使用 Number.isNaN()。
数字格式化
javascript
const num = 123.456;
// 固定小数位数
num.toFixed(2); // "123.46"(返回字符串,四舍五入)
num.toFixed(0); // "123"
// 有效数字位数
num.toPrecision(4); // "123.5"
num.toPrecision(2); // "1.2e+2"(科学记数法:1.2 × 10² = 120)
// 本地化格式
(1234567.89).toLocaleString('zh-CN'); // "1,234,567.89" Math 对象
Math 包含常用的数学函数和常量:
基本常量
javascript
Math.PI; // 3.141592653589793
Math.E; // 2.718281828459045(自然常数) 舍入方法
javascript
Math.round(3.6); // 4(四舍五入)
Math.floor(3.6); // 3(向下取整)
Math.ceil(3.2); // 4(向上取整)
Math.trunc(3.6); // 3(截断小数部分) 最大/最小
javascript
Math.max(1, 5, 3, 9, 2); // 9
Math.min(1, 5, 3, 9, 2); // 1 随机数
javascript
Math.random(); // 0~1 之间的随机数(不含 1)
Math.floor(Math.random() * 10); // 0~9 的随机整数
Math.floor(Math.random() * 6) + 1; // 1~6 的随机整数(骰子)
// 生成 min~max 之间的随机整数(含两端)
function randomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
} 其他常用函数
javascript
Math.abs(-5); // 5(绝对值)
Math.sqrt(16); // 4(平方根)
Math.pow(2, 10); // 1024(2 的 10 次方,等价于 2**10) 浮点精度与处理
前面提到 0.1 + 0.2 !== 0.3。处理方案:
javascript
// 方法1:通过整数运算避免浮点
(0.1 * 10 + 0.2 * 10) / 10; // 0.3
// 方法2:使用 toFixed
Number((0.1 + 0.2).toFixed(10)); // 0.3
// 方法3:微小误差容忍(复杂计算场景)
function isClose(a, b, epsilon = 1e-10) {
return Math.abs(a - b) < epsilon;
}
isClose(0.1 + 0.2, 0.3); // true 实用示例
javascript
// 百分比显示
const score = 82;
const total = 100;
const percentage = Math.round((score / total) * 100);
console.log(`${percentage}%`); // "82%"
// 分页计算
const totalItems = 127;
const pageSize = 20;
const totalPages = Math.ceil(totalItems / pageSize); // 7