Js中Math物件

WindrunnerMax發表於2020-10-01

Js中Math物件

Math是一個內建物件,它擁有一些數學常數屬性和數學函式方法,Math用於Number型別,其不支援BigInt

描述

Math不是一個函式物件,也就是說Math不是一個構造器,Math的所有屬性與方法都是靜態的,例如引用圓周率的寫法是Math.PIMath的常量是使用JavaScript中的全精度浮點數來定義的,需要注意的是,很多Math的函式都有一個精度,而且這個精度在不同實現中也是不相同的,這意味著不同的瀏覽器會給出不同的結果,甚至在不同的系統或架構下,相同的Js引擎也會給出不同的結果,另外三角函式sin()cos()tan()asin()acos()atan()atan2()返回的值是弧度而非角度。若要轉換,弧度除以Math.PI / 180即可轉換為角度,同理角度乘以這個數則能轉換為弧度。

console.log(Math.PI); // 3.141592653589793
console.log(Math.abs(-1)); // 1
console.log(Math.pow(2, 3)); // 8

屬性

  • Math.E: 尤拉常數,也是自然對數的底數,約等於2.718
  • Math.LN2: 2的自然對數,約等於0.693
  • Math.LN10: 10的自然對數,約等於2.303
  • Math.LOG2E: 以2為底的E的對數,約等於1.443
  • Math.LOG10E: 以10為底的E的對數,約等於0.434
  • Math.PI: 圓周率,一個圓的周長和直徑之比,約等於3.14159
  • Math.SQRT1_2: ½的平方根,同時也是2的平方根的倒數,約等於0.707
  • Math.SQRT2: 2的平方根,約等於1.414

方法

Math.abs()

Math.abs(x)
Math.abs(x)函式返回指定數字x的絕對值。

console.log(Math.abs(-1)); // 1

Math.acos()

Math.acos(x)
Math.acos()返回一個數的反餘弦值。
∀x∊[-1;1], Math.acos(x) = arccos(x) = the unique y∊[0;π] such that cos(y) = x

console.log(Math.acos(-1)); // 3.141592653589793

Math.acosh()

Math.acosh(x)
Math.acosh()函式返回一個數的反雙曲餘弦值。
∀x≥1, Math.acosh(x) = arcosh(x) = the unique y≥0 such that cosh(y) = x

console.log(Math.acosh(1)); // 0

Math.asin()

Math.asin(x)
Math.asin()方法返回一個數值的反正弦。
∀x∊[-1;1], Math.asin(x) = arcsin(x) = the unique y∊[- π/2 ; π/2 ] such that sin(y) = x

console.log(Math.asin(0)); // 0

Math.asinh()

Math.asinh(x)
Math.asinh()返回一個數值的反雙曲正弦值。
Math.asinh(x) = arsinh(x) = the unique y such that sinh(y) = x

console.log(Math.asinh(0)); // 0

Math.atan()

Math.atan(x)
Math.atan()函式返回一個數值的反正切。
Math.atan(x) = arctan(x) = the unique y∊[- π/2 ; π/2 ] such that tan(y) = x

console.log(Math.atan(0)); // 0

Math.atanh()

Math.atanh(x)
Math.atanh()函式返回一個數值反雙曲正切值。
∀x∊(-1,1), Math.atanh(x) = arctanh(x) = the unique y such that tanh(y) = x

console.log(Math.atanh(0)); // 0

Math.atan2()

Math.atan2(y, x)
Math.atan2()返回從原點(0,0)(x,y)點的線段與x軸正方向之間的平面角度(弧度值),也就是Math.atan2(y,x)

console.log(Math.atan2(15, 90)); // 0.16514867741462683

Math.cbrt()

Math.cbrt(x)
Math.cbrt()函式返回任意數字的立方根。

console.log(Math.cbrt(27)); // 3

Math.ceil()

Math.ceil(x)
Math.ceil()函式返回大於或等於一個給定數字的最小整數,即向上取整。

console.log(Math.ceil(6.6)); // 7

Math.clz32()

Math.clz32(x)
Math.clz32()函式返回一個數字在轉換成32無符號整形數字的二進位制形式後,開頭的0的個數, 比如1000000轉換成32位無符號整形數字的二進位制形式後是00000000000011110100001001000000,開頭的0的個數是12個,則Math.clz32(1000000)返回12

console.log(Math.clz32(10)); // 28

Math.cos()

Math.cos(x)
Math.cos()函式返回一個數值的餘弦值。

console.log(Math.clz32(10)); // 28

Math.cosh()

Math.cosh(x)
Math.cosh()函式返回數值的雙曲餘弦函式。

console.log(Math.cosh(0)); // 1

Math.exp()

Math.exp(x)
Math.exp()函式返回e^xx表示引數,e是自然對數的底數約2.718281828459045

console.log(Math.exp(2)); // 7.38905609893065

Math.expm1()

Math.expm1(x)
Math.exp()函式返回e^x -1x表示引數,e是自然對數的底數約2.718281828459045

console.log(Math.expm1(2)); // 6.38905609893065

Math.floor()

Math.floor()返回小於或等於一個給定數字的最大整數,即向下取整。

console.log(Math.floor(6.6)); // 6

Math.fround()

Math.fround(doubleFloat)
Math.fround()可以將任意的數字轉換為離它最近的單精度浮點數形式的數字。JavaScript內部使用64位的雙浮點數字,支援很高的精度。但是有時需要用32位浮點數字,比如從一個Float32Array讀取值時,這時會產生混亂,檢查一個64位浮點數和一個32位浮點數是否相等會失敗,即使二個數字幾乎一模一樣,要解決這個問題,可以使用Math.fround()來將64位的浮點數轉換為32位浮點數,在內部JavaScript繼續把這個數字作為64位浮點數看待,僅僅是在尾數部分的第23位執行了舍入到偶”的操作,並將後續的尾數位設定為0,如果數字超出32位浮點數的範圍,則返回Infinity-Infinity

// 數字1.5可以在二進位制數字系統中精確表示,32位和64位的值相同
console.log(Math.fround(1.5) === 1.5); // true
// 數字6.6卻無法在二進位制數字系統中精確表示,所以32位和64位的值是不同的
console.log(Math.fround(6.6) === 6.6); // false
// 在某些精度不高的場合下,可以通過將二個浮點數轉換成32位浮點數進行比較,以解決64位浮點數比較結果不正確的問題
console.log(0.1 + 0.2 === 0.3);  //false
var equal = (v1, v2) =>  Math.fround(v1) === Math.fround(v2);
console.log(equal(0.1 + 0.2, 0.3)); // true

Math.hypot()

Math.hypot([value1[,value2, ...]])
Math.hypot()函式返回所有引數的平方和的平方根。本函式比Math.sqrt()更簡單也更快,只需要呼叫Math.hypot(v1, v2)Math.hypot(v1, v2, v3, v4, ...),其還避免了幅值過大的問題,Js中最大的雙精度浮點數是Number.MAX_VALUE = 1.797...e+308,如果計算的數字比約1e154大,計算其平方值會返回Infinity,使計算的的結果出現問題。

console.log(Math.hypot(3, 4)); // 5

Math.imul()

Math.imul(a, b)
Math.imul()函式將兩個引數分別轉換為32位整數,相乘後返回32位結果,類似C語言的32位整數相乘。

console.log(Math.imul(0xffffffff, 1)); // -1

Math.log()

Math.log(x)
Math.log()函式返回一個數的自然對數。
∀x>0, Math.log(x) = ln(x) = the unique y such that e^y = x

console.log(Math.log(Math.E)); // 1

Math.log10()

Math.log10(x)
Math.log10()函式返回一個數字以10為底的對數。

console.log(Math.log10(100)); // 2

Math.log1p()

Math.log1p(x)
Math.log1p()函式返回一個數字加1後的自然對數, 既log(x+1)

console.log(Math.log1p(Math.E-1)); // 1

Math.log2()

Math.log2(x)
Math.log2()函式返回一個數字以2為底的對數。

console.log(Math.log2(8)); // 3

Math.max()

Math.max(value1[,value2, ...])
Math.max()函式返回一組數中的最大值。

console.log(Math.max(1, 2, 3)); // 3

// 在陣列中應用
console.log(Math.max.apply(null, [1, 2, 3])); // 3 // 利用了apply的傳參特性
console.log(Math.max(...[1, 2, 3])); // 3 // 利用了 ES6 Spread 操作符

Math.min()

Math.min([value1[,value2, ...]])
Math.min()返回零個或更多個數值的最小值。

console.log(Math.min(1, 2, 3)); // 1

// 在陣列中應用
console.log(Math.min.apply(null, [1, 2, 3])); // 1 // 利用了apply的傳參特性
console.log(Math.min(...[1, 2, 3])); // 1 // 利用了 ES6 Spread 操作符

Math.pow()

Math.pow(base, exponent)
Math.pow()函式返回基數base的指數exponent次冪,即base^exponent

console.log(Math.pow(2, 3)); // 8

Math.random()

Math.random()
Math.random()函式返回一個浮點數,偽隨機數在範圍從0到小於1,也就是說從0(包括0)往上,但是不包括1,然後可以縮放到所需的範圍,實現將初始種子選擇到隨機數生成演算法,其不能被使用者選擇或重置。

console.log(Math.random()); // 0.20022678953392647

function randomInt(min=0, max=1) { // 生成隨機整數
    return min + ~~((max-min)*Math.random()); // min <= random < max 
}
randomInt(1, 9); // 5

Math.round()

Math.round(x)
Math.round()函式返回一個數字四捨五入後最接近的整數。

console.log(Math.round(0.5)); // 1

Math.sign()

Math.sign(x)
Math.sign()函式返回一個數字的符號, 指示數字是正數,負數還是零。此函式共有5種返回值, 分別是1, -1, 0, -0, NaN代表的各是正數,負數,正零,負零,NaN

console.log(Math.sign(0.5)); // 1

Math.sin()

Math.sin(x)
Math.sin()函式返回一個數值的正弦值。

console.log(Math.sin(Math.PI / 2)); // 1

Math.sinh()

Math.sinh(x)
Math.sinh()函式返回一個數字的雙曲正弦值。

console.log(Math.sinh(0)); // 0

Math.sqrt()

Math.sqrt(x)
Math.sqrt()函式返回一個數的平方根。
∀x≥0, Math.sqrt(x) = x = the unique y≥0 such that y^2 = x

console.log(Math.sqrt(9)); // 3

Math.tan()

Math.tan(x)
Math.tan()方法返回一個數值的正切值。

console.log(Math.tan(0)); // 0

Math.tanh()

Math.tanh(x)
Math.tanh()函式將會返回一個數的雙曲正切函式值。

console.log(Math.tanh(0)); // 0

Math.trunc()

Math.trunc(value)
Math.trunc()方法會將數字的小數部分去掉,只保留整數部分。

console.log(Math.trunc(1.1)); // 1

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math

相關文章