教育行业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 分享到:
和我们在线交谈!