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