昨天在單位做一個效果,是圖層向四周擴散的,需要用到Math.round。做完以后,突然產生了一個小念頭:這個方法在JS中是如何寫出來的?
有了想法之后就開始動手了,首先是將數字轉換成字符串:
String(11.2);// return "11.2"
然后就是用split去獲取小數點的位置並且將字符串變為整數和小數:
String(11.2).split(".")//return ["11", "2"];
然后就是對小數部分的判斷了,通過substring方法獲取字符串第一個字符,來看看是進位還是退位:
String(11.234).split(".")[1].substring(0,1);//return "2";
然后通過parseInt來轉換並判斷:
parseInt(String(11.234).split(".")[1].substring(0,1)) < 5;//return true;
最后是通過判斷正負來做最后的處理:
parseInt(String(11.234).split(".")[0].substring(0,1))>0;//return false;
下面是全代碼:
//代碼及思路源自另一個朋友~
function round (arg) { if(parseInt(String(arg).split(".")[1].substring(0,1)) < 5){ return parseInt(String(arg).split(".")[0]); } else{ if (parseInt(String(arg).split(".")[0]) > 0) { return parseInt(String(arg).split(".")[0]) + 1; } else{ return parseInt(String(arg).split(".")[0]) - 1; } } }
寫到這里貌似是完了,但是突然想了想,如果不使用JS的方法,能否做到這一點呢?
於是進行了簡單的嘗試,首先是如何不使用方法來獲取小數點后的內容?如果不能使用類型轉換而只能使用基本運算,那很難獲取。其實,我要的不是獲取這個數字,而是判定這個數字是否大於0.5。那么,這就方便多了:
var round_x = (((10 * arg) % 10) > 0) ? ((10 * arg) % 10) : -((10 * arg) % 10);// 獲得小數點后的數字*10
當獲取到這個數字后,我們便可以進行最基本的判定來獲取結果了。代碼如下:
function round (arg) { var round_x = (((10 * arg) % 10) > 0) ? ((10 * arg) % 10) : -((10 * arg) % 10); if (round_x < 5) { return arg - (arg % 1); }else{ return (arg > 0 ? (arg - (arg % 1) +1) : arg - (arg % 1) - 1); } }
通過簡單的四則運算,我們便獲取到了round的結果。
代碼比較簡單,希望有更優秀的代碼,可以相互交流,謝謝~