乐鱼电竞

  • 教育行业A股IPO第一股(股票代码 003032)

    全国咨询/投诉热线:400-618-4000

    web前端开发培训之JS中toFixed四舍五入的坑

    更新时间:2016年10月13日10时58分 来源:乐鱼播客前端与移动开发学院 浏览次数:

    最近发现JS当中toFixed方法存在一些问题。toFixed这个函数一直在用,以前都是把 Number 四舍五入为指定小数位数的数字,没有考虑其他。今天需要考虑扩展一下功能,于是搜索了一下,竟然发现了一个大坑。
    请看下面的例子:
    1. var num = 3.15;
    2. var n = num.toFixed(1);
    3. console.log(n);
    打印结果是3.1!
    说好的四舍五入呢?不急,再看下面的例子:
    1. var num = 3.25;
    2. var n = num.toFixed(1);
    3. console.log(n);
    纳尼?3.3!这下又四舍五入了。why?网上有人据此整理出“四舍六入,五看奇偶”的原则,就是说大于五的就进一位,五呢偶进奇不进。那么是不是这样呢?请看下面的例子:
    1. var num1 = 3.55;
    2. var num2 = 3.65;
    3. var num3 = 3.05;
    4. var n1 = num1.toFixed(1);
    5. var n2 = num2.toFixed(1);
    6. var n3 = num3.toFixed(1);
    7. console.log(n1,n2,n3);
    效果预览:

    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps50B3.tmp.jpg
    按照“四舍六入,五看奇偶”的原则,n1==3.5是对的,n2==3.7才是, n3==3.1(这里不讨论0算不算偶数,根据我小学知识算它偶数)才对嘛。然并卵,机器是不会骗人的。

    根据测试,2、3、4、7、8、9这几个都会四舍五入。
    还有谁不懵逼的!?
    根据多方查证,完美的处理方式是自己改写这个函数。

    至于JavaScript内部是为什么,没去抠。有兴趣的同学可以去研究下,希望不吝赐教。

    当然,对于大多数情况,这个问题也不是什么问题。

    另外,附带提一下push()。
    网上有的同学把join错写成push时出了问题,形如下面:
    1. //目标,希望得到1
    2. var arr = ["1"];
    3. console.log(arr.join(","));
    4. //错写,结果得到2
    5. var arr = ["1"];
    6. console.log(arr.push(","));
    效果预览:
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps50C4.tmp.jpg
    why?其实我们仔细点就可以发现,join那里打印出来的是字符串"1",push那里打印出来的是数字2。

        join()把数组中的所有元素转换为一个字符串,返回结果---转换后的字符串。
        push()是往数组中添加新元素,返回结果---新数组的长度。

    综上所述,结果并没有问题,只是这位同学不清楚两个函数的返回结果。



    本文版权归乐鱼播客web前端开发培训学院所有,欢迎转载,转载请注明作者出处,谢谢!
    作者:乐鱼播客web前端开发培训学院
    首发:http://www.itcast.cn/web/
    0 分享到:
    和我们在线交谈!
  • 【网站地图】【sitemap】