JavaScript - 如果...没有方法(xjl456852修改)

Posted 三杯两盏淡酒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript - 如果...没有方法(xjl456852修改)相关的知识,希望对你有一定的参考价值。

本文是对下面这篇文章中存在的错误进行修改,并增加少量注释.

原文出处:

javascript - 如果...没有方法

http://www.cnblogs.com/silin6/p/4367019.html


这篇文章源于我上一周所读的一篇12年的文章。原作者提出了一个问题,如果js没有原生方法Math.round(),我们如何去实现呢?

对此我和我的基友进行了小小探讨,并给出了一些有意思的答案。

本文内容如下:

  • 如果...没有方法
  • 解决方案
  • 另类解决方案
  • 简单的分析
  • 参考和引用

JavaScript - 前端开发交流群:377786580

如果...没有方法

这篇文章源于上周所读的一篇2012年的文章(为了强行塞点文章篇幅,所以把该文链接放到最后的引用了...希望原作者和读者体谅下....)。
原作者在使用了Math.round()方法之后,突然产生了一个小念头。

如果,js没有Math.round()方法,我们又该如何去实现呢?

为此展开了一些探讨。我知道发表这么一篇文章肯定小有争议,但仍需要注明的是这篇文章仅供娱乐,或者说——玩玩代码,不会太在意性能、健壮、逻辑严谨性等XXOO的东西。
Math.round()就是传说中的四舍五入啦...

        Math.round(12.1);//12
        Math.round(12.8);//13
        Math.round(-12.1);//-12
        Math.round(-12.8);//-13

解决方案

原作者提供了这么些思路:

例如数字6.2,先把6.2转换为字符串,然后通过String.prototype.split()方法来分割字符串,判定字符串索引为1的值是否大于5,再处理索引为0的值,代码如下:

        //num===6.2
        function round(num) {
            var nums = String(num).split("."),//[6,2]
                num0 = nums[0],//6
                num1 = nums[1];//2

            if (parseInt(num1.substring(0, 1)) < 5) { //2<5
                return parseInt(num0);
            } else {
                if (num0 > 0) {
                    return parseInt(num0) + 1;
                } else {//负数
                    return parseInt(num0) - 1;
                }
            }
        }

原作者并不满意上面的解决方案,提出了如果连js原生方法都不使用呢?什么String()parseInt()都不使用该怎么去做呢?
于是提出了第二种解决方案:

这个问题的关键在于判定小数点后的数字是否大于5,所以我们把传递进来的数字6.2*10%10即可得到小数点后的数字,这时候再判定这个小数是否大于5即可。

        //num===6.2
        function round(num) {
            var round_x = (((10 * num) % 10) > 0) ?
                ((10 * num) % 10) : //正数
                -((10 * num) % 10);//负数

            if (round_x < 5) {
                return num - (num % 1);//把小数点后的的数字干掉
            } else {
                return (num > 0 ?
                    (num - (num % 1) + 1) : //正数
                    num - (num % 1) - 1); //负数
            }
        }

原文只讲述到这里,后来我跟基友聊到了这篇文章,我的基友给出了另外一点思路:

因为是四舍五入原理,所以给当前的数字+0.5,得到的值直接丢弃小数点后面的部分转换为整数(类似parseInt),原来的数字也转换为整数丢弃小数点后面的部分,这两个数如果相差<1,表示取原来数字的整数,否则取新数字的整数。

        function round(num) {
            var value = num > 0 ?
                num + 0.5 :     //正数
                -(num - 0.5);   //负数
            value = value - value % 1;//得到新数的整数部分
            //如果相差<1
            return value - num < 1 ?
                   num - num % 1 :
                   value;
        }

至此,稍微正常点的解决方案介绍完毕,下面我们来感受下什么叫做玩代码。

另类解决方案

听到基友的思路我表示非常赞非常好人民需要你代码需要你下一个图灵目测就是你了小伙子要不要买本《颈椎病康复指南》看看决定如何拯救世界?
然后给他感受了一下这个世界森森的恶意——也就是原文评论里的代码。
下面是欣赏代码时间,分析代码之类的肯定要放在后面。

        //@Gray Zhang的"给跪版",不支持负数
        function round(x) {
            return ~~(x + 0.5);
        }


        //@Gray Zhang的"给跪加深版",支持正负数
        function round(x) {
            return ~~(x > 0 ? (x + 0.5) : (x - 0.5));
        }

        
        //@强子~Developer的"请收下我的膝盖版"
        function round(x) {
            return (x > 0 ? x + 0.5 : x - 0.5) | 0;
        }

看到这些代码当时我就给跪了,突然有种回家找家影楼给别人撒撒花,扬扬裙摆,送送快递的想法。好吧,我承认我的位运算就是个渣。

Matlab数值计算差商与插值

sklearn中SVM调参说明

JavaScript - 如果...没有方法(xjl456852修改)

php习题

P2163 [SHOI2007]园丁的烦恼

xj监控端口,模拟登陆脚本