JS,如果没有方法。。。(不借助任何JS方法实现round方法)
昨天在单位做一个效果,是图层向四周扩散的,需要用到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的结果。
代码比较简单,希望有更优秀的代码,可以相互交流,谢谢~