数字类型Number,JavaScript

98 阅读3分钟

数字类型

在现代 JavaScript 中,数字(number)有两种类型:

  1. JavaScript 中的常规数字以 64 位的格式 IEEE-754 存储,也被称为“双精度浮点数”。这是我们大多数时候所使用的数字,我们将在本章中学习它们。
  2. BigInt 用于表示任意长度的整数。有时会需要它们,因为正如我们在前面的章节 数据类型 中提到的,常规整数不能安全地超过 (253-1) 或小于 -(253-1)。由于仅在少数特殊领域才会用到 BigInt,因此我们在特殊的章节 BigInt 中对其进行了介绍。

可以使用下划线 _ 作为分隔符:

let billion = 1_000_000_000;

可以通过在数字后面附加字母 "e" 并指定零的个数来缩短数字:


let billion = 1e9;  // 10 亿,字面意思:数字 1 后面跟 9 个 0

alert( 7.3e9 );  // 73 亿(与 7300000000 和 7_300_000_000 相同)
十六进制前缀0x,二进制0b和八进制数字前缀0o

toString(base)

方法 num.toString(base) 返回在给定 base 进制数字系统中 num 的字符串表示形式。

举个例子:

let num = 255;

alert( num.toString(16) );  // ff
alert( num.toString(2) );   // 11111111

base 的范围可以从 2 到 36。默认情况下是 10

舍入

舍入(rounding)是使用数字时最常用的操作之一。

这里有几个对数字进行舍入的内建函数:

  • Math.floor

    向下舍入:3.1 变成 3-1.1 变成 -2

  • Math.ceil

    向上舍入:3.1 变成 4-1.1 变成 -1

  • Math.round

    向最近的整数舍入:3.1 变成 33.6 变成 4,中间值 3.5 变成 4

  • Math.trunc(IE 浏览器不支持这个方法)

    移除小数点后的所有内容而没有舍入:3.1 变成 3-1.1 变成 -1

这个是总结它们之间差异的表格:

Math.floorMath.ceilMath.roundMath.trunc
3.13433
3.63443
-1.1-2-1-1-1
-1.6-2-1-2-1

不精确的计算

在内部,数字是以 64 位格式 IEEE-754 表示的,所以正好有 64 位可以存储一个数字:其中 52 位被用于存储这些数字,其中 11 位用于存储小数点的位置,而 1 位用于符号。

如果一个数字真的很大,则可能会溢出 64 位存储,变成一个特殊的数值 Infinity

测试:isFinite 和 isNaN

还记得这两个特殊的数值吗?

  • Infinity(和 -Infinity)是一个特殊的数值,比任何数值都大(小)。
  • NaN 代表一个 error。

它们属于 number 类型,但不是“普通”数字 用Object.is 进行比较

  • isNaN(value) 将其参数转换为数字,然后检测它是否为 NaN
  • isFinite(value) 将其参数转换为数字,如果它是常规数字,则返回 true,而不是 NaN/Infinity/-Infinity

其他数学函数

  • Math.random()

  • 返回一个从 0 到 1 的随机数(不包括 1)。

    alert( Math.random() ); // 0.1234567894322
    alert( Math.random() ); // 0.5435252343232
    alert( Math.random() ); // ... (任何随机数)
    
  • Math.max(a, b, c...) 和 Math.min(a, b, c...)

    从任意数量的参数中返回最大值和最小值。

    alert( Math.max(3, 5, -10, 0, 1) ); // 5
    alert( Math.min(1, 2) ); // 1
    
  • Math.pow(n, power)

    返回 n 的给定(power)次幂。

    alert( Math.pow(2, 10) ); // 2 的 10 次幂 = 1024
    

Math 对象中还有更多函数和常量,包括三角函数