iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 4
0
Modern Web

30天入門JavaScript系列 第 4

【Day 4】數字型別跟Math方法

今天來把數學運算相關的東西寫一寫

JavaScript小數運算須注意的點

首先JavaScript的數字是以浮點數表示(詳細可以看wiki)

簡單說明的話,浮點數因為原理的關係,沒有辦法顯示或運算很精確的數值

可以看以下範例

let numA = 0.1;
let numB = 0.2;

let numC = 3.1415;
let numD = 3.000000000000000000123456;

console.log(numA + numB === 0.3); //false  不該是true嗎?
console.log(numC); // 3.1415
console.log(numD); // 3 小數點去哪了?

所以在用JS做運算時要小心,尤其是拿小數作比較的情況。

Infinity(無限大)

JS能的數值是有限的,內建的Number.MAX_VALUE值表示JS能保存的最大數值
如果超過最大值會被轉為特殊的值Infinity(無限大),另外也有負的-Infinity(負無限大)

let max = Number.MAX_VALUE;

console.log(max); // 1.7976931348623157e+308
console.log(max * 2);//Infinity
console.log(-max * 2);//-Infinity
console.log(1 / 0);//Infinity  拿數字除0的結果也是無限大

NaN

NaN(Not a Number)是一個特殊值,雖然字面上意思是"不是一個數字",
但用typeof去檢驗型別,NaN就是數字

console.log(typeof NaN); //number

個人解釋NaN是"不能用數值表示的數字"
當數學運算結果不能以數值表示時,結果就會是NaN,像昨天拿兩個字串相減的結果

let num = 200;
let strA = '我不是個數字~~';
let strB = '我也不是數字';

console.log(num - strA); //NaN
console.log(strB - strA); //NaN

用內建Math方法來運算

Math是JS內建的物件,內建有許多方法來幫助我們做數學運算
如果還不知道什麼是物件跟方法,先當作是JS內建的功能來使用。

這邊介紹幾個最常用到的方法

Math.abs(值):回傳絕對值
Math.ceil(值):回傳比值大中,最接近的整數
Math.floor(值):回傳比值大中,最接近的整數
Math.round(值):回傳四捨五入的數

嗯?Math.ceil()Math.floor()不是單純的無條件進位跟無條件捨去嗎?
在值是正數的情況下是,但在值的負數的情況下結果會反過來,在做數學運算需要注意

let numA = 3.14;
let numB = 3.5;
let numC = -3.14;

console.log(Math.ceil(numA)); //4
console.log(Math.floor(numA)); //3
console.log(Math.round(numA)); //3
console.log(Math.round(numB)); //4

console.log(Math.abs(numC)); //3.14

console.log(Math.ceil(numC)); //-3
console.log(Math.floor(numC)); //-4
console.log(Math.round(numC)); //-3

另外還有計算對數、三角函數等運算的方法能用,詳情請洽MDN

取隨機數

Math.random()這個方法可以回傳從0~1間(不包含0跟1)的隨機小數,
利用這個方法可以來取各種隨機值。

舉個簡單的例子,現在我們想要做一個隨機骰出1~6點數的骰子

  • 使用Math.random()取一個小數 (0~1間數字)
  • 把這個數乘6 (0~6間數字,不會是6)
  • 再把這個數無條件捨去 (0~5整數)
  • 做加一的動作(1~6整數)

以下是實作範例

let num = Math.random(); //假設隨機數是0.25

console.log(num); //0.25
num *= 6;
console.log(num); //1.5
num = Math.floor(num);
console.log(num); //1
num++;
console.log(num); //2

console.log(Math.floor(Math.random() * 6) + 1); //全部寫在一起的做法

今天就到這邊,明天是字串相關介紹~


上一篇
【Day 3】值的運算(加減乘除)跟比較(==、===)
下一篇
【Day 5】if、switch判斷式
系列文
30天入門JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言