## 16\. `Math`
> 原文: [http://exploringjs.com/impatient-js/ch_math.html](http://exploringjs.com/impatient-js/ch_math.html)
>
> 贡献者:[飞龙](https://github.com/wizardforcel)
`Math`是具有数据属性和处理数字的方法的对象。
你可以把它看作一个伪模块。今天,它可能会被创建为一个模块,但它早在模块之前就存在了。
### 16.1。数据属性
* `Math.E: number` <sup>[ES1]</sup>
欧拉数,自然对数的基数,约为 2.7182818284590452354。
* `Math.LN10: number` <sup>[ES1]</sup>
10 的自然对数,约为 2.302585092994046。
* `Math.LN2: number` <sup>[ES1]</sup>
2 的自然对数为,约为 0.6931471805599453。
* `Math.LOG10E: number` <sup>[ES1]</sup>
`e`的基数为 10 的对数,约为 0.4342944819032518。
* `Math.LOG2E: number` <sup>[ES1]</sup>
`e`的基数为 2 的对数,约为 1.4426950408889634。
* `Math.PI: number` <sup>[ES1]</sup>
数学常数 π,圆周长与直径的比值,约为 3.1415926535897932。
* `Math.SQRT1_2: number` <sup>[ES1]</sup>
1/2 的平方根,约为 0.7071067811865476。
* `Math.SQRT2: number` <sup>[ES1]</sup>
2 的平方根,约为 1.4142135623730951。
### 16.2。指数,根,对数
* `Math.cbrt(x: number): number` <sup>[ES6]</sup>
返回`x`的立方根。
```js
> Math.cbrt(8)
2
```
* `Math.exp(x: number): number` <sup>[ES1]</sup>
返回`e ** x`(`e`为欧拉数)。`Math.log()`的逆。
```js
> Math.exp(0)
1
> Math.exp(1) === Math.E
true
```
* `Math.expm1(x: number): number` <sup>[ES6]</sup>
返回`Math.exp(x)-1`。`Math.log1p()`的逆。非常小的数字(接近 0 的小数)以更高的精度表示。只要`.exp()`的结果接近 1,此函数就会返回更精确的值。
* `Math.log(x: number): number` <sup>[ES1]</sup>
返回`x`的自然对数(基数为`e`,欧拉常数)。 `Math.exp()`的逆。
```js
> Math.log(1)
0
> Math.log(Math.E)
1
> Math.log(Math.E ** 2)
2
```
* `Math.log1p(x: number): number` <sup>[ES6]</sup>
返回`Math.log(1 + x)`。 `Math.expm1()`的逆。非常小的数字(接近 0 的徐爱三个月)以更高的精度表示。只要`.log()`的参数接近 1,你就可以向此函数提供更精确的数字。
* `Math.log10(x: number): number` <sup>[ES6]</sup>
返回`x`的基数为 10 的对数。`10 ** x`的逆。
```js
> Math.log10(1)
0
> Math.log10(10)
1
> Math.log10(100)
2
```
* `Math.log2(x: number): number` <sup>[ES6]</sup>
返回`x`的基数为 2 的对数。`2 ** x`的逆。
```js
> Math.log2(1)
0
> Math.log2(2)
1
> Math.log2(4)
2
```
* `Math.pow(x: number, y: number): number` <sup>[ES1]</sup>
计算`x`的`y`次幂。与`x ** y`相同。
```js
> Math.pow(2, 3)
8
> Math.pow(25, 0.5)
5
```
* `Math.sqrt(x: number): number` <sup>[ES1]</sup>
返回`x`的平方根。 `x ** 2`的逆。
```js
> Math.sqrt(9)
3
```
### 16.3。舍入
舍入意味着将任意数字转换为整数(不带小数的数字)。表 15 列出了可用的函数,以及它们为少数代表性输入返回的内容。
表 15:`Math`的舍入函数
| | `-2.9` | `-2.5` | `-2.1` | `2.1` | `2.5` | `2.9` |
| --- | --- | --- | --- | --- | --- | --- |
| `Math.floor` | `-3` | `-3` | `-3` | `2` | `2` | `2` |
| `Math.ceil` | `-2` | `-2` | `-2` | `3` | `3` | `3` |
| `Math.round` | `-3` | `-2` | `-2` | `2` | `3` | `3` |
| `Math.trunc` | `-2` | `-2` | `-2` | `2` | `2` | `2` |
* `Math.ceil(x: number): number` <sup>[ES1]</sup>
返回`x ≤ i`的最小(最接近`-∞`)整数`i`。
```js
> Math.ceil(1.9)
2
> Math.ceil(2.1)
3
```
* `Math.floor(x: number): number` <sup>[ES1]</sup>
返回`i ≤ x`的最大(最接近`+∞`)整数`i`。
```js
> Math.floor(1.9)
1
> Math.floor(2.1)
2
```
* `Math.round(x: number): number` <sup>[ES1]</sup>
返回最接近`x`的整数(接近正无穷大的整数)。如果`x`的小数部分为`.5`,则`.round()`向上舍入:
```js
> Math.round(2.5)
3
> Math.round(-2.5)
-2
```
* `Math.trunc(x: number): number` <sup>[ES6]</sup>
删除`x`的小数部分并返回整数结果。
```js
> Math.trunc(1.9)
1
> Math.trunc(2.1)
2
```
### 16.4。三角函数
所有角度均以弧度表示。使用以下两个函数在度和弧度之间进行转换。
```js
function toRadians(degrees) {
return degrees / 180 * Math.PI;
}
function toDegrees(radians) {
return radians / Math.PI * 180;
}
```
* `Math.acos(x: number): number` <sup>[ES1]</sup>
返回`x`的反余弦。
```js
> Math.acos(0)
1.5707963267948966
> Math.acos(1)
0
```
* `Math.acosh(x: number): number` <sup>[ES6]</sup>
返回`x`的反双曲余弦值。
* `Math.asin(x: number): number` <sup>[ES1]</sup>
返回`x`的反正弦。
```js
> Math.asin(0)
0
> Math.asin(1)
1.5707963267948966
```
* `Math.asinh(x: number): number` <sup>[ES6]</sup>
返回`x`的反双曲正弦值。
* `Math.atan(x: number): number` <sup>[ES1]</sup>
返回`x`的反正切。
* `Math.atanh(x: number): number` <sup>[ES6]</sup>
返回`x`的反双曲正切值。
* `Math.atan2(y: number, x: number): number` <sup>[ES1]</sup>
返回商 y / x 的反正切。
* `Math.cos(x: number): number` <sup>[ES1]</sup>
返回`x`的余弦值。
```js
> Math.cos(0)
1
> Math.cos(Math.PI)
-1
```
* `Math.cosh(x: number): number` <sup>[ES6]</sup>
返回`x`的双曲余弦值。
* `Math.hypot(...values: number[]): number` <sup>[ES6]</sup>
返回`values`(毕达哥拉斯定理)的平方和的平方根:
```js
> Math.hypot(3, 4)
5
```
* `Math.sin(x: number): number` <sup>[ES1]</sup>
返回`x`的正弦值。
```js
> Math.sin(0)
0
> Math.sin(Math.PI / 2)
1
```
* `Math.sinh(x: number): number` <sup>[ES6]</sup>
返回`x`的双曲正弦值。
* `Math.tan(x: number): number` <sup>[ES1]</sup>
返回`x`的正切值。
```js
> Math.tan(0)
0
> Math.tan(1)
1.5574077246549023
```
* `Math.tanh(x: number): number;` <sup>[ES6]</sup>
返回`x`的双曲正切值。
### 16.5。 asm.js 助手
WebAssembly 是一个基于 JavaScript 的虚拟机,大多数 JavaScript 引擎都支持它。
asm.js 是 WebAssembly 的前身。如果编译静态语言(例如 C++),它是 JavaScript 的一个子集,可以生成快速可执行文件。在某种程度上,它也是一个虚拟机,在 JavaScript 的范围内。
以下两种方法有助于 asm.js,并且几乎没有用例。
* `Math.fround(x: number): number` <sup>[ES6]</sup>
将`x`舍入为 32 位浮点值(`float`)。asm.js 告诉引擎在内部使用`float`值(正常数字是双精度并占用 64 位)。
* `Math.imul(x: number, y: number): number` <sup>[ES6]</sup>
将两个 32 位整数`x`和`y`相乘,并返回结果的低 32 位。需要 asm.js 。通过将 64 位结果强制转换为 32 位,可以模拟所有其他基本的 32 位数学运算。使用乘法,您可能会丢失超过 32 位的结果位。
### 16.6。各种其他函数
* `Math.abs(x: number): number` <sup>[ES1]</sup>
返回`x`的绝对值。
```js
> Math.abs(3)
3
> Math.abs(-3)
3
> Math.abs(0)
0
```
* `Math.clz32(x: number): number` <sup>[ES6]</sup>
计算 32 位整数`x`中的前导零位。用于 DSP 算法。
```js
> Math.clz32(0b01000000000000000000000000000000)
1
> Math.clz32(0b00100000000000000000000000000000)
2
> Math.clz32(2)
30
> Math.clz32(1)
31
```
* `Math.max(...values: number[]): number` <sup>[ES1]</sup>
将`values`转换为数字并返回最大的数字。
```js
> Math.max(3, -5, 24)
24
```
* `Math.min(...values: number[]): number` <sup>[ES1]</sup>
将`values`转换为数字并返回最小的数字。
```js
> Math.min(3, -5, 24)
-5
```
* `Math.random(): number` <sup>[ES1]</sup>
返回伪随机数`n`,其中 `0 ≤ n < 1`。
计算随机整数`i`,其中 `0 ≤ i < max`:
```js
function getRandomInteger(max) {
return Math.floor(Math.random() * max);
}
```
* `Math.sign(x: number): number` <sup>[ES6]</sup>
返回数字的符号:
```js
> Math.sign(-8)
-1
> Math.sign(0)
0
> Math.sign(3)
1
```
### 16.7。来源
* 维基百科
* [TypeScript 的内置类型](https://github.com/Microsoft/TypeScript/blob/master/lib/)
* [JavaScript 的 MDN 网络文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
* [ECMAScript 语言规范](https://tc39.github.io/ecma262/)
- I.背景
- 1.关于本书(ES2019 版)
- 2.常见问题:本书
- 3. JavaScript 的历史和演变
- 4.常见问题:JavaScript
- II.第一步
- 5.概览
- 6.语法
- 7.在控制台上打印信息(console.*)
- 8.断言 API
- 9.测验和练习入门
- III.变量和值
- 10.变量和赋值
- 11.值
- 12.运算符
- IV.原始值
- 13.非值undefined和null
- 14.布尔值
- 15.数字
- 16. Math
- 17. Unicode - 简要介绍(高级)
- 18.字符串
- 19.使用模板字面值和标记模板
- 20.符号
- V.控制流和数据流
- 21.控制流语句
- 22.异常处理
- 23.可调用值
- VI.模块化
- 24.模块
- 25.单个对象
- 26.原型链和类
- 七.集合
- 27.同步迭代
- 28.数组(Array)
- 29.类型化数组:处理二进制数据(高级)
- 30.映射(Map)
- 31. WeakMaps(WeakMap)
- 32.集(Set)
- 33. WeakSets(WeakSet)
- 34.解构
- 35.同步生成器(高级)
- 八.异步
- 36. JavaScript 中的异步编程
- 37.异步编程的 Promise
- 38.异步函数
- IX.更多标准库
- 39.正则表达式(RegExp)
- 40.日期(Date)
- 41.创建和解析 JSON(JSON)
- 42.其余章节在哪里?