JavaScript数字
JavaScript使用IEEE 754标准的64位浮点格式表示数字,这意味着JavaScript可以准确表示整数和浮点数。JavaScript中只有一种数字类型,没有区分整数和浮点数。
数字的创建
数字字面量
使用数字字面量创建数字:
javascript
const integer = 42;
const float = 3.14;
const negative = -10;
const zero = 0;
Number构造函数
使用Number构造函数创建数字:
javascript
const integer = new Number(42);
const float = new Number(3.14);
注意:使用构造函数创建的数字是对象,而不是基本数据类型:
javascript
const num1 = 42;
const num2 = new Number(42);
console.log(typeof num1); // number
console.log(typeof num2); // object
数字字符串转换
使用Number()函数将字符串转换为数字:
javascript
const str = "42";
const num = Number(str);
console.log(num); // 42
数字类型
JavaScript中的数字包括:
- 整数:如1、2、3
- 浮点数:如3.14、2.718
- 科学计数法:如1e3(1000)、1e-3(0.001)
- 特殊值:
Infinity、-Infinity、NaN
科学计数法
用于表示非常大或非常小的数字:
javascript
const large = 1e6; // 1000000
const small = 1e-6; // 0.000001
八进制和十六进制
使用前缀表示八进制和十六进制:
javascript
// 八进制(前缀0o或0O)
const octal = 0o10;
console.log(octal); // 8
// 十六进制(前缀0x或0X)
const hex = 0x10;
console.log(hex); // 16
特殊数值
Infinity
表示正无穷大:
javascript
console.log(Infinity); // Infinity
console.log(1 / 0); // Infinity
console.log(Number.MAX_VALUE * 2); // Infinity
-Infinity
表示负无穷大:
javascript
console.log(-Infinity); // -Infinity
console.log(-1 / 0); // -Infinity
console.log(-Number.MAX_VALUE * 2); // -Infinity
NaN
表示"不是数字"(Not a Number):
javascript
console.log(NaN); // NaN
console.log("abc" * 2); // NaN
console.log(Math.sqrt(-1)); // NaN
console.log(0 / 0); // NaN
注意:NaN不等于任何值,包括它自己:
javascript
console.log(NaN === NaN); // false
console.log(NaN == NaN); // false
数字的常用方法
数字转字符串
toString()
将数字转换为字符串:
javascript
const num = 42;
console.log(num.toString()); // "42"
// 指定进制
console.log(num.toString(2)); // "101010"(二进制)
console.log(num.toString(8)); // "52"(八进制)
console.log(num.toString(16)); // "2a"(十六进制)
toFixed()
将数字转换为指定小数位数的字符串:
javascript
const num = 3.14159;
console.log(num.toFixed(2)); // "3.14"
console.log(num.toFixed(4)); // "3.1416"
console.log(num.toFixed(0)); // "3"
toPrecision()
将数字转换为指定精度的字符串:
javascript
const num = 3.14159;
console.log(num.toPrecision(3)); // "3.14"
console.log(num.toPrecision(5)); // "3.1416"
toExponential()
将数字转换为科学计数法的字符串:
javascript
const num = 1234;
console.log(num.toExponential()); // "1.234e+3"
console.log(num.toExponential(2)); // "1.23e+3"
数字检测
isNaN()
检查值是否为NaN:
javascript
console.log(isNaN(NaN)); // true
console.log(isNaN("abc")); // true
console.log(isNaN(42)); // false
注意:isNaN()会将非数字值转换为数字,再检查是否为NaN。
Number.isNaN()
ES6引入的Number.isNaN()方法,直接检查值是否为NaN:
javascript
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN("abc")); // false
console.log(Number.isNaN(42)); // false
isFinite()
检查值是否为有限数字:
javascript
console.log(isFinite(42)); // true
console.log(isFinite(Infinity)); // false
console.log(isFinite(NaN)); // false
Number.isFinite()
ES6引入的Number.isFinite()方法,直接检查值是否为有限数字:
javascript
console.log(Number.isFinite(42)); // true
console.log(Number.isFinite("42")); // false
console.log(Number.isFinite(Infinity)); // false
Number.isInteger()
ES6引入的Number.isInteger()方法,检查值是否为整数:
javascript
console.log(Number.isInteger(42)); // true
console.log(Number.isInteger(42.0)); // true
console.log(Number.isInteger(42.1)); // false
Number.isSafeInteger()
ES6引入的Number.isSafeInteger()方法,检查值是否为安全整数(可以准确表示的整数):
javascript
console.log(Number.isSafeInteger(42)); // true
console.log(Number.isSafeInteger(2**53)); // false
console.log(Number.isSafeInteger(2**53 - 1)); // true
数学运算
JavaScript支持基本的数学运算和复杂的数学函数。
基本运算符
- 加法:
+ - 减法:
- - 乘法:
* - 除法:
/ - 取模:
%(返回除法的余数) - 指数:
**(ES6引入)
javascript
console.log(2 + 3); // 5
console.log(5 - 2); // 3
console.log(2 * 3); // 6
console.log(6 / 2); // 3
console.log(7 % 3); // 1
console.log(2 ** 3); // 8
赋值运算符
=:赋值+=:加法赋值-=:减法赋值*=:乘法赋值/=:除法赋值%=:取模赋值**=:指数赋值
javascript
let x = 5;
x += 3; // x = x + 3 → 8
x -= 2; // x = x - 2 → 6
x *= 2; // x = x * 2 → 12
x /= 3; // x = x / 3 → 4
x %= 2; // x = x % 2 → 0
x **= 3; // x = x ** 3 → 0
自增和自减运算符
++:自增--:自减
javascript
let x = 5;
console.log(x++); // 5(先返回x,再自增)
console.log(x); // 6
let y = 5;
console.log(++y); // 6(先自增,再返回y)
console.log(y); // 6
Math对象
JavaScript提供了Math对象,包含各种数学常量和函数。
数学常量
Math.PI:圆周率(约3.14159)Math.E:自然对数的底数(约2.71828)Math.LN2:2的自然对数(约0.69315)Math.LN10:10的自然对数(约2.30259)Math.LOG2E:以2为底的e的对数(约1.4427)Math.LOG10E:以10为底的e的对数(约0.43429)Math.SQRT1_2:1/2的平方根(约0.70711)Math.SQRT2:2的平方根(约1.41421)
javascript
console.log(Math.PI); // 3.141592653589793
console.log(Math.E); // 2.718281828459045
数学函数
舍入函数
Math.round(x):四舍五入到最接近的整数Math.ceil(x):向上取整Math.floor(x):向下取整Math.trunc(x):截断小数部分(ES6引入)
javascript
console.log(Math.round(3.14)); // 3
console.log(Math.round(3.5)); // 4
console.log(Math.ceil(3.14)); // 4
console.log(Math.ceil(3.99)); // 4
console.log(Math.floor(3.14)); // 3
console.log(Math.floor(3.99)); // 3
console.log(Math.trunc(3.14)); // 3
console.log(Math.trunc(-3.14)); // -3
绝对值和符号
Math.abs(x):返回绝对值Math.sign(x):返回符号(-1、0或1,ES6引入)
javascript
console.log(Math.abs(-3.14)); // 3.14
console.log(Math.sign(-3)); // -1
console.log(Math.sign(0)); // 0
console.log(Math.sign(3)); // 1
乘方和开方
Math.pow(x, y):返回x的y次幂Math.sqrt(x):返回平方根Math.cbrt(x):返回立方根(ES6引入)Math.hypot(...values):返回所有参数的平方和的平方根(ES6引入)
javascript
console.log(Math.pow(2, 3)); // 8
console.log(Math.sqrt(16)); // 4
console.log(Math.cbrt(27)); // 3
console.log(Math.hypot(3, 4)); // 5
三角函数
Math.sin(x):正弦Math.cos(x):余弦Math.tan(x):正切Math.asin(x):反正弦Math.acos(x):反余弦Math.atan(x):反正切Math.atan2(y, x):返回从原点到(x, y)的角度
注意:参数是弧度,不是角度。
javascript
console.log(Math.sin(Math.PI / 2)); // 1
console.log(Math.cos(Math.PI)); // -1
console.log(Math.tan(Math.PI / 4)); // 1
指数和对数
Math.exp(x):返回e的x次幂Math.log(x):自然对数Math.log10(x):以10为底的对数(ES6引入)Math.log2(x):以2为底的对数(ES6引入)Math.expm1(x):返回e^x - 1(ES6引入)Math.log1p(x):返回ln(1 + x)(ES6引入)
javascript
console.log(Math.exp(1)); // Math.E
console.log(Math.log(Math.E)); // 1
console.log(Math.log10(100)); // 2
console.log(Math.log2(8)); // 3
最大值和最小值
Math.max(...values):返回最大值Math.min(...values):返回最小值
javascript
console.log(Math.max(1, 2, 3, 4, 5)); // 5
console.log(Math.min(1, 2, 3, 4, 5)); // 1
随机数
Math.random():返回0到1之间的随机数(包括0,不包括1)
javascript
console.log(Math.random()); // 0到1之间的随机数
// 生成0到10之间的随机整数
const randomInt = Math.floor(Math.random() * 11);
// 生成1到10之间的随机整数
const randomInt = Math.floor(Math.random() * 10) + 1;
// 生成min到max之间的随机整数(包括min和max)
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
数字精度问题
由于JavaScript使用IEEE 754标准的浮点数表示,某些小数运算可能会出现精度问题:
javascript
console.log(0.1 + 0.2); // 0.30000000000000004
解决方法:
javascript
// 使用toFixed()转换为字符串后再转换为数字
console.log(+(0.1 + 0.2).toFixed(1)); // 0.3
// 先乘以10的幂,转换为整数运算,再除以10的幂
console.log((0.1 * 10 + 0.2 * 10) / 10); // 0.3
数字的最大值和最小值
Number.MAX_VALUE:可表示的最大正数Number.MIN_VALUE:可表示的最小正数Number.MAX_SAFE_INTEGER:可安全表示的最大整数Number.MIN_SAFE_INTEGER:可安全表示的最小整数
javascript
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
console.log(Number.MIN_VALUE); // 5e-324
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
数字转换
字符串转数字
Number(str):转换为数字parseInt(str, radix):解析为整数parseFloat(str):解析为浮点数
javascript
console.log(Number("42")); // 42
console.log(Number("3.14")); // 3.14
console.log(Number("abc")); // NaN
console.log(parseInt("42")); // 42
console.log(parseInt("42.5")); // 42
console.log(parseInt("1010", 2)); // 10(二进制转十进制)
console.log(parseInt("FF", 16)); // 255(十六进制转十进制)
console.log(parseFloat("42.5")); // 42.5
console.log(parseFloat("42")); // 42
数字转字符串
num.toString():转换为字符串String(num):转换为字符串num + "":隐式转换为字符串
javascript
const num = 42;
console.log(num.toString()); // "42"
console.log(String(num)); // "42"
console.log(num + ""); // "42"
数字的最佳实践
- 避免直接比较浮点数:由于精度问题,不要直接比较浮点数
- 使用Number.isNaN():使用
Number.isNaN()代替isNaN() - 使用Math.random()生成随机数:使用
Math.random()生成随机数,而不是自己实现 - 注意数字的范围:了解JavaScript数字的最大值、最小值和安全整数范围
常见问题
为什么0.1 + 0.2不等于0.3?
因为JavaScript使用IEEE 754标准的浮点数表示,某些小数不能被准确表示,导致运算结果出现精度问题。
如何检查一个值是否为数字?
javascript
function isNumber(value) {
return typeof value === "number" && Number.isFinite(value);
}
console.log(isNumber(42)); // true
console.log(isNumber("42")); // false
console.log(isNumber(NaN)); // false
console.log(isNumber(Infinity)); // false
继续学习:JavaScript布尔值
最后更新:2026-02-08