最近发现JS当中toFixed方法存在一些问题。toFixed这个函数一直在用,以前都是把 Number 四舍五入为指定小数位数的数字,没有考虑其他。今天需要考虑扩展一下功能,于是搜索了一下,竟然发现了一个大坑。
请看下面的例子:
- var num = 3.15;
- var n = num.toFixed(1);
- console.log(n);
而打印结果是3.1!
说好的四舍五入呢?不急,再看下面的例子:
- var num = 3.25;
- var n = num.toFixed(1);
- console.log(n);
纳尼?3.3!这下又四舍五入了。why?网上有人据此整理出“四舍六入,五看奇偶”的原则,就是说大于五的就进一位,五呢偶进奇不进。那么是不是这样呢?请看下面的例子:
- var num1 = 3.55;
- var num2 = 3.65;
- var num3 = 3.05;
- var n1 = num1.toFixed(1);
- var n2 = num2.toFixed(1);
- var n3 = num3.toFixed(1);
- 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
- var arr = ["1"];
- console.log(arr.join(","));
- //错写,结果得到2
- var arr = ["1"];
- console.log(arr.push(","));
效果预览:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps50C4.tmp.jpg
why?其实我们仔细点就可以发现,join那里打印出来的是字符串"1",push那里打印出来的是数字2。
join()把数组中的所有元素转换为一个字符串,返回结果---转换后的字符串。
push()是往数组中添加新元素,返回结果---新数组的长度。