Do what you do

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的结果。

 

代码比较简单,希望有更优秀的代码,可以相互交流,谢谢~

 

posted @ 2012-09-11 16:32  key yao  阅读(3243)  评论(35编辑  收藏  举报
学会做事 学会做人