JavaScript Math
Math 是一個內(nèi)置對象, 它具有數(shù)學(xué)常數(shù)和函數(shù)的屬性和方法。(MDN)
Math 對象提供了一些列的數(shù)學(xué)方法和常量,如三角函數(shù)、隨機(jī)數(shù)、π等。
1. 數(shù)學(xué)方法
數(shù)學(xué)方法其實(shí)就是常用的數(shù)學(xué)中的函數(shù),如三角函數(shù)。
其中用到較多的是使用 Math.random()
來產(chǎn)生隨機(jī)數(shù)。
以下列舉部分常用的方法。
1.1 Math.floor
Math.floor() 返回小于或等于一個給定數(shù)字的最大整數(shù)。
Math.floor就是對一個數(shù)進(jìn)行向下取整。
var num1 = Math.floor(2.4);
var num2 = Math.floor(2.9);
console.log(num1); // 輸出:2
console.log(num2); // 輸出:2
因?yàn)槭窍蛳氯≌?,不會進(jìn)行四舍五入,所以不論是 2.4
還是 2.9
,經(jīng)過 Math.floor
處理后,都為 2
。
1.2 Math.ceil
Math.ceil() 函數(shù)返回大于或等于一個給定數(shù)字的最小整數(shù)。
Math.ceil 就是對一個數(shù)進(jìn)行向上取整。
var num1 = Math.ceil(2.4);
var num2 = Math.ceil(2.9);
console.log(num1); // 輸出:3
console.log(num2); // 輸出:3
與 Math.floor 相反,Math.ceil 向上取整,也不會進(jìn)行四舍五入,所以結(jié)果都為 3 。
許多開發(fā)者經(jīng)常會弄混
Math.floor
與Math.ceil
,其實(shí)可以根據(jù)方法名的中譯來記憶,floor 可以理解成地板,ceil 可以理解成天花板,所以前者是向下取整,后者是向上取整。
1.3 Math.random
Math 下的 random 方法調(diào)用后返回一個大于等于零且小于一
的隨機(jī)數(shù),即區(qū)間 [0, 1)
。
var random = Math.random();
console.log(random);
可以嘗試運(yùn)行多次這段代碼,random
變量的值出現(xiàn)一樣的概率很低。
事實(shí)上 Math.random() 產(chǎn)生的隨機(jī)數(shù)并不是真正的隨機(jī)數(shù),其返回的“隨機(jī)數(shù)”是由一個確定的算法得出的,這種隨機(jī)數(shù)會稱之為
偽隨機(jī)數(shù)
。
1.3.1 隨機(jī)數(shù)應(yīng)用
在需要隨機(jī)數(shù)的需求時,大部分情況下不會是需要一個區(qū)間為 [0, 1) 的隨機(jī)數(shù),如按學(xué)號抽獎。
假設(shè)學(xué)號的范圍是 1 至 100 ,那就需要產(chǎn)生一個 1 至 100 之間的隨機(jī)數(shù)。
這樣可以換個思路,隨機(jī)數(shù)還是生成 [0, 1) 范圍的大小,但是將這個值放大到 [1, 100] 區(qū)間的范圍。
所以就可以把隨機(jī)數(shù)的結(jié)果先放大 100 倍,即 Math.random() * 100
,這時候產(chǎn)生的數(shù),區(qū)間就是 [0, 100)
。
因?yàn)樽钚≈敌枰氖?,而不是1,就可以將這個隨機(jī)數(shù)表達(dá)式修改成 Math.random() * 100 + 1
,這時候區(qū)間就變成了 [1, 101)
。
最后只要保證右側(cè)的區(qū)間不大于 100 即可,因?yàn)橛覀?cè)區(qū)間取不到 101 ,所以可以對結(jié)果進(jìn)行向下取整。
最終表達(dá)式為:
Math.floor(Math.random() * 100 + 1);
由此就可以推出一個較為通用的隨機(jī)數(shù)公式:
// 隨機(jī)數(shù)區(qū)間:[下限, 上限]
Math.floor(Math.random() * 上限 + 下限);
2. 數(shù)學(xué)常量
許多數(shù)學(xué)常量被作為屬性放在 Math
對象下,如歐拉常數(shù)(E)
,圓周率(PI)
。
var e = Math.E;
var pi = Math.PI;
console.log(e); // 輸出:2.718281828459045
console.log(pi); // 輸出:3.141592653589793
日常開發(fā)中,大部分情況下會選擇自己維護(hù)一個常量,因?yàn)榭梢噪S時的統(tǒng)一的修改精度。
3. 常量與方法列表
因?yàn)槎际浅A颗c方法,這里提供相應(yīng)的列表供快速查閱,內(nèi)容引用自 MDN 。
3.1 常量
常量 | 描述 |
---|---|
Math.E | 表示自然對數(shù)的底數(shù)(或稱為基數(shù)),約等于 2.718。 |
Math.LN10 | 表示 10 的自然對數(shù),約為 2.302。 |
Math.LN2 | 表示 2 的自然對數(shù),約為 0.693。 |
Math.LOG10E | 表示以 10 為底數(shù),e 的對數(shù),約為 0.434。 |
Math.LOG2E | 表示以 2 為底數(shù),e 的對數(shù),約為 1.442。 |
Math.PI | 表示一個圓的周長與直徑的比例,約為 3.14159。 |
Math.SQRT1_2 | 屬性表示 1/2 的平方根,約為 0.707。 |
Math.SQRT2 | 表示 2 的平方根,約為 1.414。 |
3.2 方法
方法 | 描述 |
---|---|
Math.abs | 返回一個數(shù)的的絕對值。 |
Math.acos | 返回一個數(shù)的反余弦值(單位為弧度)。 |
Math.acosh | 返回一個數(shù)字的反雙曲余弦值。 |
Math.asin | 返回一個數(shù)值的反正弦(單位為弧度)。 |
Math.asinh | 返回給定數(shù)字的反雙曲正弦值 |
Math.atan | 返回一個數(shù)值的反正切(以弧度為單位) |
Math.atan2 | 返回從原點(diǎn)(0,0)到(x,y)點(diǎn)的線段與x軸正方向之間的平面角度(弧度值)。 |
Math.atanh | 函數(shù)返回一個數(shù)值反雙曲正切值。 |
Math.cbrt | 返回任意數(shù)字的立方根。 |
Math.ceil | 返回大于或等于一個給定數(shù)字的最小整數(shù)。 |
Math.clz32 | 返回一個數(shù)字在轉(zhuǎn)換成 32 無符號整形數(shù)字的二進(jìn)制形式后, 開頭的 0 的個數(shù)。 |
Math.cos | 返回一個數(shù)值的余弦值。 |
Math.cosh | 返回?cái)?shù)值的雙曲余弦函數(shù)。 |
Math.exp | 函數(shù)返回 ex,x 表示參數(shù),e 是歐拉常數(shù)(Euler’s constant),自然對數(shù)的底數(shù)。 |
Math.expm1 | 函數(shù)返回 Ex - 1, 其中 x 是該函數(shù)的參數(shù), E 是自然對數(shù)的底數(shù)。 |
Math.floor | 返回小于或等于一個給定數(shù)字的最大整數(shù)。 |
Math.fround | 將任意的數(shù)字轉(zhuǎn)換為離它最近的單精度浮點(diǎn)數(shù)形式的數(shù)字。 |
Math.hypot | 函數(shù)返回它的所有參數(shù)的平方和的平方根。 |
Math.imul | 該函數(shù)將兩個參數(shù)分別轉(zhuǎn)換為 32 位整數(shù),相乘后返回 32 位結(jié)果,類似 C 語言的 32 位整數(shù)相乘。 |
Math.log | 返回一個數(shù)的自然對數(shù)。 |
Math.log10 | 函數(shù)返回一個數(shù)字以 10 為底的對數(shù)。 |
Math.log1p | 函數(shù)返回一個數(shù)字加1后的自然對數(shù) (底為 E), 即log(x+1)。 |
Math.log2 | 函數(shù)返回一個數(shù)字以 2 為底的對數(shù)。 |
Math.max | 返回一組數(shù)中的最大值。 |
Math.min | 返回零個或更多個數(shù)值的最小值。 |
Math.pow | 函數(shù)返回基數(shù)(base)的指數(shù)(exponent)次冪,即 baseexponent。 |
Math.random | 函數(shù)返回一個浮點(diǎn), 偽隨機(jī)數(shù)在范圍從0到小于1,也就是說,從0(包括0)往上,但是不包括1(排除1)。 |
Math.round | 函數(shù)返回一個數(shù)字四舍五入后最接近的整數(shù)。 |
Math.sign | 函數(shù)返回一個數(shù)字的符號, 指示數(shù)字是正數(shù),負(fù)數(shù)還是零。 |
Math.sin | 函數(shù)返回一個數(shù)值的正弦值。 |
Math.sinh | 函數(shù)返回一個數(shù)字(單位為角度)的雙曲正弦值。 |
Math.sqrt | 函數(shù)返回一個數(shù)的平方根。 |
Math.tan | 返回一個數(shù)值的正切值。 |
Math.tanh | 函數(shù)將會返回一個數(shù)的雙曲正切函數(shù)值。 |
Math.trunc | 方法會將數(shù)字的小數(shù)部分去掉,只保留整數(shù)部分。 |
4. 小結(jié)
Math 對象包含了很多數(shù)學(xué)方法與常量,較常用的是用于產(chǎn)生偽隨機(jī)數(shù)的 Math.random
,根據(jù)特性可以推出隨機(jī)數(shù) [下限, 上限]
的生成公式 Math.floor(Math.random() * 上限 + 下限);
。
盡量將 Math 對象下的方法過一遍,留住印象,避免造不必要的輪子。