1. 程式人生 > >javaScript的Math數學物件 --用法大全

javaScript的Math數學物件 --用法大全

   Math是 JavaScript 的原生物件,提供各種數學功能。該物件不是建構函式,不能生成例項,所有的屬性和方法都必須在Math物件上呼叫。簡而言之就如同java的靜態類一樣,都是通過類名.方法名()呼叫的。

        Math物件的用法大致可以分為“靜態屬性”和“靜態方法”這兩大類,幾乎所有的前端運算都可以採取這兩種方式解決。有許多運算甚至如同小學生般的簡單,今日我就帶領大家“回爐重造,重返小學”。現在想想假如我們從小學就已經開始程式設計了,那麼……(今天公司的CTO可能就是你們,站在舞臺上裝逼的也是你們,你們也許就不會看我的技術文章了,而我可能還在繼續我的寫作)。 

1.Math物件的靜態屬性

Math物件的靜態屬性,提供以下一些數學常數。

  • Math.E:常數e
  • Math.LN2:2 的自然對數。
  • Math.LN10:10 的自然對數。
  • Math.LOG2E:以 2 為底的e的對數。
  • Math.LOG10E:以 10 為底的e的對數。
  • Math.PI:常數π
  • Math.SQRT1_2:0.5 的平方根。
  • Math.SQRT2:2 的平方根。
Math.E // 2.718281828459045
Math.LN2 // 0.6931471805599453
Math.LN10 // 2.302585092994046
Math.LOG2E // 1.4426950408889634
Math.LOG10E // 0.4342944819032518
Math.PI // 3.141592653589793
Math.SQRT1_2 // 0.7071067811865476
Math.SQRT2 // 1.4142135623730951

特別注意: 這些屬性都是隻讀的,不能修改。

其實,我想說,上面這些亂七八糟的屬性,我壓根就不太懂,除了那個π,其它的一個也不認識,你們認識嗎?認識的請舉手,不認識的請閃過(因為這不重要)。

2.Math物件的靜態方法

Math物件提供以下一些靜態方法。

  • Math.abs():絕對值
  • Math.ceil():向上取整
  • Math.floor():向下取整
  • Math.max():最大值
  • Math.min():最小值
  • Math.pow():指數運算
  • Math.sqrt():平方根
  • Math.log():自然對數
  • Math.exp()e的指數
  • Math.round()
    :四捨五入
  • Math.random():隨機數

下面我帶領大家一起來逐個分析這些小學生的方法:

2.1 Math.abs() 求絕對值

Math.abs(1) // 1
Math.abs(-1) // 1

       各位同學們,有沒有回憶起來,小學的那節課將到了求絕對值的只是啊?歲月真是把殺豬刀,轉眼間,青春年華已逝去,往事不堪回首程式碼中。

2.2 Math.max(),Math.min() 返回最大,最小值

       Math.max方法返回引數之中最大的那個值,Math.min返回最小的那個值。如果引數為空, Math.min返回InfinityMath.max返回-Infinity。(補充:Infinity是javaScript能表達的最大整數,反之-Infinity是最小的。)

Math.max(2, -1, 5) // 5
Math.min(2, -1, 5) // -1
Math.min() // Infinity
Math.max() // -Infinity

2.3 Math.floor(),Math.ceil() 向下,上取整     

 Math.floor方法返回小於引數值的最大整數(地板值)。

Math.floor(3.2) // 3
Math.floor(-3.2) // -4

 Math.ceil方法返回大於引數值的最小整數(天花板值)。

Math.ceil(3.2) // 4
Math.ceil(-3.2) // -3

       同學們注意了,這裡有一個坑需要注意:如果你想捨棄掉小數部分,許多人往往會採用Math.floor()方法,那就錯了。因為如果引數是一個負小數,採用Math.floor()方法就改變,增大了負整數部分的值了。那麼如何解決這個問題呢?我們並不知道傳如的到底是正數,還是負數。這個時候高手就會想到用三元運算子,一氣呵成,菜鳥就總想著用if……else判斷,彷彿如果美妙的歌唱般習慣性的if…… “假如時光到流我能做什麼,找你沒說的卻想要的,假如我不放手你多年以後,會怪我恨我或感動。”對,沒錯,慣用if else的菜鳥們,就是這個節奏。

       其實,咋們可以寫一個函式,解決這個問題:

function ToInteger(x) {
  x = Number(x);
  return x < 0 ? Math.ceil(x) : Math.floor(x);
}

ToInteger(3.2) // 3
ToInteger(3.5) // 3
ToInteger(3.8) // 3
ToInteger(-3.2) // -3
ToInteger(-3.5) // -3
ToInteger(-3.8) // -3

3.4 Math.round() 四捨五入法

Math.round(0.1) // 0
Math.round(0.5) // 1
Math.round(0.6) // 1

// 等同於
Math.floor(x + 0.5)

注意,它對負數的處理(主要是對0.5的處理),且開始反人類了,顛覆你的三觀。

Math.round(-1.1) // -1
Math.round(-1.5) // -1
Math.round(-1.6) // -2

看看上面的程式碼,Math.round(-1.1),按照四捨五入的規則,小數點1小於5,所以捨棄了,返回了-1,這好正常哦。可是當小數點是5的時候,尼瑪的,不是說四捨五入嗎?為啥5還是被捨棄掉了;再看當小數點大於5的時候,尼瑪的且返回了-2,不是應該進一位嗎,怎麼越變越小了啊?這不科學啊!我覺得應該扇javaScript原設計者Brendan Eich兩耳光。有沒有人認同我的觀念?告訴你們,可千萬別被我前面的三言兩語給忽悠了。你仔細想想啊,如果負數也嚴格按照四捨五入進行的話,-0.5就該增大,就應該變成0,不是0難道還變成1不成?這不瞎搞嗎! 然後 -1.1呢,說是四捨五入,所以就捨棄了0.1,但是因為是負數啊,捨棄了小數位反而是增加了值,所以看上去有些別捏,不合常理。最後呢-1.6,你說該怎麼個取捨法?四捨五入,增大一位 + 1?那不就變成0了嗎?oh!my god!簡直不可理喻。

3.5 Math.pow() 求引數x次方的值

Math.pow方法返回以第一個引數為底數、第二個引數為冪的指數值。

// 等同於 2 ** 2
Math.pow(2, 2) // 4
// 等同於 2 ** 3
Math.pow(2, 3) // 8

下面是計算圓面積的方法(圓的面積計算公式是 π×r2 ):

var radius = 20;
var area = Math.PI * Math.pow(radius, 2);

2.6 Math.sqrt()  求引數的平方根

Math.sqrt方法返回引數值的平方根。如果引數是一個負值,則返回NaN

Math.sqrt(4) // 2
Math.sqrt(-4) // NaN

2.7 Math.log() 返回以e為底的自然對數值

Math.log(Math.E) // 1
Math.log(10) // 2.302585092994046

如果要計算以10為底的對數,可以先用Math.log求出自然對數,然後除以Math.LN10;求以2為底的對數,可以除以Math.LN2

Math.log(100)/Math.LN10 // 2
Math.log(8)/Math.LN2 // 3

2.8 Math.exp() 返回常數e的引數次方。

Math.exp(1) // 2.718281828459045
Math.exp(3) // 20.085536923187668

2.9 Math.random() 返回0到1之間的一個偽隨機數,可能等於0,但是一定小於1。

Math.random() // 0.7151307314634323

任意範圍的隨機數生成函式如下:

function getRandomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}

getRandomArbitrary(1.5, 6.5)
// 2.4942810038223864

上面的函式所生成的隨機化的範圍是 0 - max之間,為什麼呢?想不明白的請關注公眾號《深度程式設計》留言諮詢。

任意範圍的隨機整數生成函式如下:

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

getRandomInt(1, 6) // 5

返回隨機字元的例子如下:

function random_str(length) {
  var ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  ALPHABET += 'abcdefghijklmnopqrstuvwxyz';
  ALPHABET += '0123456789-_';
  var str = '';
  for (var i = 0; i < length; ++i) {
    var rand = Math.floor(Math.random() * ALPHABET.length);
    str += ALPHABET.substring(rand, rand + 1);
  }
  return str;
}

random_str(6) // "NdQKOr"

上面程式碼中,random_str函式接受一個整數作為引數,返回變數ALPHABET內的隨機字元所組成的指定長度的字串。想不明白的請關注公眾號《深度程式設計》留言諮詢。學習要認真,別一眼飄過,看不懂的時候一定要停下來,弄懂了才能有所進步。

2.10 三角函式方法 

Math物件還提供一系列三角函式方法。

  • Math.sin():返回引數的正弦(引數為弧度值)
  • Math.cos():返回引數的餘弦(引數為弧度值)
  • Math.tan():返回引數的正切(引數為弧度值)
  • Math.asin():返回引數的反正弦(返回值為弧度值)
  • Math.acos():返回引數的反餘弦(返回值為弧度值)
  • Math.atan():返回引數的反正切(返回值為弧度值)
Math.sin(0) // 0
Math.cos(0) // 1
Math.tan(0) // 0

Math.sin(Math.PI / 2) // 1

Math.asin(1) // 1.5707963267948966
Math.acos(1) // 0
Math.atan(1) // 0.7853981633974483

上面這一坨,我真不知道是什麼東東,我也不想知道。哈哈哈……

       好了,親愛的同學們,如果有什麼疑問需要交流,或者想獲取更多資訊及技術的推送,請關注我們的公眾號《深度程式設計》,謝謝!