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

首页技术文章正文

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

更新时间:2017-06-28 来源:黑马程序员前端与移动开发学院 浏览量:

最近发现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://web.itheima.com/

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

http://www.itcast.cn/subject/uizly/index.shtml?seozxuids

14天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

15天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

8天免费试学

基础班入门课程限时免费

申请试学名额

20天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

0天免费试学

基础班入门课程限时免费

申请试学名额

12天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

5天免费试学

基础班入门课程限时免费

申请试学名额

10天免费试学

基础班入门课程限时免费

申请试学名额
在线咨询 我要报名