黑马程序员IT技术论坛

搜索
加入黑马找回密码

QQ登录

只需一步,快速开始

2017年最新学习路线图黑马币兑换技术分通道神攻略:入学/技术分/生活/就业黑马入学流程各环节的评分标准
查看: 211|回复: 0

[学习交流] JS中toFixed四舍五入的坑

[复制链接]
  • TA的每日心情
    奋斗
    2017-1-19 11:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    246

    黑马币

    1

    技术分

    96

    主题

    超级版主

    Rank: 8Rank: 8

    发表于 2016-10-7 11:42:43 | 显示全部楼层 |阅读模式
    本帖最后由 月亮是我掰弯的 于 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);
    复制代码

    效果预览:
    1.jpg



    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(","));
    复制代码

    效果预览:

    2.jpg

    file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml/wps50C4.tmp.jpg
    why?其实我们仔细点就可以发现,join那里打印出来的是字符串"1",push那里打印出来的是数字2。

        join()把数组中的所有元素转换为一个字符串,返回结果---转换后的字符串
        push()是往数组中添加新元素,返回结果---新数组的长度

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

    回复

    使用道具 举报

    发表回复

    *滑动验证:
    您需要登录后才可以回帖 登录 | 加入黑马

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条


    快速回复 返回顶部 返回列表