A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 月亮是我掰弯的 于 2016-10-10 16:17 编辑


最近发现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()是往数组中添加新元素,返回结果---新数组的长度

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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马