JavaScript 数字与 Math

JavaScript 的数字类型只有一个 number,同时提供 Math 对象来处理数学运算。

数字转换

Number() / parseInt() / parseFloat()

将字符串转为数字:

javascript
document.write(Number('42') + '<br>');        // 42
document.write(Number('3.14') + '<br>');      // 3.14
document.write(Number('42px') + '<br>');      // NaN
document.write(Number('') + '<br>');          // 0
document.write(Number(true) + '<br>');        // 1
document.write(Number(false) + '<br>');       // 0

document.write(parseInt('42') + '<br>');      // 42
document.write(parseInt('42px') + '<br>');    // 42
document.write(parseInt('3.14') + '<br>');    // 3
document.write(parseFloat('3.14') + '<br>');  // 3.14
document.write(parseFloat('3.14px') + '<br>'); // 3.14

区别:Number() 要求整个字符串都是合法数字,否则返回 NaNparseInt/parseFloat 从开头解析,直到遇到非数字字符。parseInt 第二个参数指定进制:parseInt('FF', 16)255

检查数值

javascript
// 是否是 NaN
document.write(Number.isNaN(NaN) + '<br>');      // true
document.write(Number.isNaN('hello') + '<br>');  // false

// 是否是有限数
document.write(Number.isFinite(42) + '<br>');          // true
document.write(Number.isFinite(Infinity) + '<br>');    // false
document.write(Number.isFinite('42') + '<br>');        // false

// 是否在安全整数范围内
document.write(Number.isSafeInteger(9007199254740991) + '<br>');  // true
document.write(Number.isSafeInteger(9007199254740992) + '<br>');  // false

不要用 isNaN() 全局函数——它会先将参数转为数字,导致 isNaN('hello') 返回 true(因为 Number('hello')NaN)。始终使用 Number.isNaN()

数字格式化

javascript
const num = 123.456;

// 固定小数位数
document.write(num.toFixed(2) + '<br>');      // "123.46"
document.write(num.toFixed(0) + '<br>');      // "123"

// 有效数字位数
document.write(num.toPrecision(4) + '<br>');  // "123.5"
document.write(num.toPrecision(2) + '<br>');  // "1.2e+2"

// 本地化格式
document.write((1234567.89).toLocaleString('zh-CN') + '<br>'); // "1,234,567.89"

Math 对象

Math 包含常用的数学函数和常量:

基本常量

javascript
document.write(Math.PI + '<br>');  // 3.141592653589793
document.write(Math.E + '<br>');   // 2.718281828459045

舍入方法

javascript
document.write(Math.round(3.6) + '<br>');  // 4
document.write(Math.floor(3.6) + '<br>');  // 3
document.write(Math.ceil(3.2) + '<br>');   // 4
document.write(Math.trunc(3.6) + '<br>');  // 3

最大/最小

javascript
document.write(Math.max(1, 5, 3, 9, 2) + '<br>'); // 9
document.write(Math.min(1, 5, 3, 9, 2) + '<br>'); // 1

随机数

javascript
document.write(Math.random() + '<br>');                        // 0~1 之间的随机数(不含 1)
document.write(Math.floor(Math.random() * 10) + '<br>');       // 0~9 的随机整数
document.write(Math.floor(Math.random() * 6) + 1 + '<br>');    // 1~6 的随机整数(骰子)

// 生成 min~max 之间的随机整数(含两端)
function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
document.write(randomInt(1, 100) + '<br>'); // 调用函数

其他常用函数

javascript
document.write(Math.abs(-5) + '<br>');     // 5
document.write(Math.sqrt(16) + '<br>');    // 4
document.write(Math.pow(2, 10) + '<br>');  // 1024

浮点精度与处理

前面提到 0.1 + 0.2 !== 0.3。处理方案:

javascript
// 方法1:通过整数运算避免浮点
document.write(((0.1 * 10 + 0.2 * 10) / 10) + '<br>'); // 0.3

// 方法2:使用 toFixed
document.write(Number((0.1 + 0.2).toFixed(10)) + '<br>'); // 0.3

// 方法3:微小误差容忍(复杂计算场景)
function isClose(a, b, epsilon = 1e-10) {
  return Math.abs(a - b) < epsilon;
}
document.write(isClose(0.1 + 0.2, 0.3) + '<br>'); // true

实用示例

javascript
// 百分比显示
const score = 82;
const total = 100;
const percentage = Math.round((score / total) * 100);
document.write(`${percentage}%<br>`); // "82%"

// 分页计算
const totalItems = 127;
const pageSize = 20;
const totalPages = Math.ceil(totalItems / pageSize); // 7
document.write(totalPages + '<br>'); // 7