# Number

## 数值字面量    <a href="#number-literal-format" id="number-literal-format"></a>

* 最基本的数值字面量格式是十进制整数；
* 整数还可以通过八进制或十六进制的字面值来表示；八进制字面值的第一位必须是零(0)，然后是八进制数字序列(0\~7)。如果字面值中的数值超出了范围，那么前导零将被忽略，后面的数值将被当作十进制数值解析；
* ```javascript
  var octalNum1 = 070; // 八进制的 56
  var octalNum2 = 079; // 无效的八进制数值——解析为 79
  var octalNum3 = 08; // 无效的八进制数值——解析为 8
  ```
* e 表示法，10的指数次幂，`3.125e3` 表示 `3.125*10^3`，`3.125e-3` 表示 `3.125*10^-3`；
* 浮点数值的最高精度是 17 位小数，但在进行算术计算时其精确度远远不如整数，浮点计算的误差是使用基于 IEEE754 数值的浮点计算的通病，永远不要测试某个特定的浮点数值；

## 数值范围   <a href="#range" id="range"></a>

* ECMAScript 能够表示的最小数值保 存在 `Number.MIN_VALUE` 中—在大多数浏览器中，这个值是 `5e-324`；
* 能够表示的最大数值保存在 `Number.MAX_VALUE` 中—在大多数浏览器中，该值是`1.7976931348623157e+308`；
* 超出数值范围的值，将被自动转换成特殊的 `Infinity` 值。负数会被转换成 `-Infinity` (负无穷)，正数则会被转换成 `Infinity` (正无穷)，`Infinity` 不能够参与计算；
* `Number.NEGATIVE_INFINITY` 和 `Number.POSITIVE_INFINITY` 分别保存 `-Infinity` 和 `Infinity`；
* 正数除以 0 返回 `Infinity`，负数除以 0 返回 `-Infinity`；
* `isFinite()` 函数，检验参数是否位于最小与最大数值之间，返回 `true/false`；
* 监测和监控极大或极小数值的必要性；

## NaN   <a href="#nan" id="nan"></a>

* `NaN` 的特殊性，用于表示一个本来要返回数值的操作数未返回数值的情况；
* 任何涉及 `NaN` 的操作(例如 `NaN/10` )都会返回 `NaN`；
* `NaN` 与任何值都不相等，包括 `NaN` 本身，`NaN == NaN; // false`；
* 0 除以 0 才会返回 `NaN`；
* `typeof NaN;` 返回 `"number"`；
* `isNaN()` 函数，接受一个参数，确定这个参数是否“不是数值”。`isNaN()` 在接收到一个值之后，会将这个值转换为数值。某些不是数值的值会直接转换为数值，例如字符串 `"10"` 或 `Boolean` 值。而任何不能被转换为数值的值都会导致这个函数返回 `true`；

## 数值转换   <a href="#conversions" id="conversions"></a>

* **Number()**，用于任何数据类型，一元加操作符的操作与 `Number()` 函数相同，转换规则如下：

  |      数据类型     | Number()结果                                                                                                    |
  | :-----------: | ------------------------------------------------------------------------------------------------------------- |
  |  **Boolean**  | 0 或 1                                                                                                         |
  |    **Null**   | 0                                                                                                             |
  | **Undefined** | NaN                                                                                                           |
  |   **Number**  | 简单的传入和返回                                                                                                      |
  |   **String**  | 空字符串，则将其转换为 0； 只包含数字，则将其转换为十进制数值，忽略前导0； 包含有效的浮点格式，则转换为对应的浮点数值； 包含有效的十六进制格式，则转换为十进制整 数值； 包含除上述格式之外的字符，则转换为 NaN |
  |   **Object**  | 调用 `valueOf()` 方法，依照前面的规则转换返回的值。如果转换的结果是 NaN，则调用 `toString()` 方法，然后再次依照前面的规则转换返回的字符串值                         |
* ```javascript
  Number({}); // NaN
  Number([]); // 0
  Number([2]); // 2
  Number([2,3]); // NaN
  ```
* **parseInt()**，string => number(整数)，会忽略前面的空直至找到第一个非空格字符，`Number()` 函数在转换字符串时比较复杂而且不够合理，因此在处理整数的时候更常用的是 `parseInt()` 函数，转换规则如下：

  |    数据类型    | parseInt()结果                                                                                                                          |
  | :--------: | ------------------------------------------------------------------------------------------------------------------------------------- |
  | **String** | 空字符串，则将其转换为 NaN； 第一个字符不是数字字符或者负号，转换为 NaN； 如果第一个字符是数字字符，会继续向后解析直到结束或遇见非数字字符 以"0x"开头且后跟数字字符，就会将其当作一个十六进制整数； 以"0"开头且后跟数字字符，则会将其当作一个八进制数； |
* ```javascript
  var num1 = parseInt("1234blue");  // 1234
  var num2 = parseInt("");  // NaN
  var num3 = parseInt("0xA"); // 10(十六进制数)
  var num4 = parseInt(22.5); // 22
  var num5 = parseInt("070"); // 56(八进制数)
  var num6 = parseInt("70"); // 70(十进制数) 
  var num7 = parseInt("0xf"); // 15(十六进制数)

  var num1 = parseInt("10", 2); //2 (按二进制解析) 
  var num2 = parseInt("10", 8); //8 (按八进制解析)
  var num3 = parseInt("10", 10); //10 (按十进制解析)
  var num4 = parseInt("10", 16); //16 (按十六进制解析)
  ```
* **parseFloat()**，string => number(浮点数)，与 `parseInt()` 函数类似，但只解析十进制值，规则如下：

  |    数据类型    | parseInt()结果                                                                                                                              |
  | :--------: | ----------------------------------------------------------------------------------------------------------------------------------------- |
  | **String** | 空字符串，则将其转换为 NaN； 第一个字符不是数字字符或者负号，转换为 NaN； 如果第一个字符是数字字符，会继续向后解析直到结束或遇见非数字字符 十六进制格式的字符串则始终会被转换成 0； 如果字符串包含的是一个可解析为整数的数`parseFloat()` 会返回整数； |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://jaimecheng.gitbook.io/javascript/datatype/number.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
