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() 要求整个字符串都是合法数字,否则返回 NaNparseInt/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