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-InfinityNaN

科学计数法

用于表示非常大或非常小的数字:

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"

数字的最佳实践

  1. 避免直接比较浮点数:由于精度问题,不要直接比较浮点数
  2. 使用Number.isNaN():使用Number.isNaN()代替isNaN()
  3. 使用Math.random()生成随机数:使用Math.random()生成随机数,而不是自己实现
  4. 注意数字的范围:了解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