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

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

更新时间:2016年11月23日14时49分 来源:传智播客web前端开发培训学院 浏览次数:

最近发现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前端开发学院所有,欢迎转载,转载请注明作者出处,谢谢!
作者:传智播客web前端培训学院;
首发:http://www.itcast.cn/web/ 

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

uids

北京校区

    14天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    8天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    0天免费试学

    基础班入门课程限时免费

    申请试学名额

    12天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    10天免费试学

    基础班入门课程限时免费

    申请试学名额