zoukankan      html  css  js  c++  java
  • jquery的toFixed方法的正确使用

    最近一段时候公司的项目中遇到这么个事情,需要计算手续费,而这个手续费必须是保留小数点后面两位,且是由小数点后面第三位四舍五入,就这么个场景:

    说说我计算的过程,下面是前两个数是测试用的:

    howMuch = 119;

    allow_sum = 116;

    interest = 0.005;//这是利率

    计算出来的是(119-116)*0.005 = 0.015,按照业务要求四舍五入保留小数点后2位,结果应该是0.02

    1.一开始直接使用的toFixed方法计算的手续费:

      计算方式:value = (((howMuch-allow_sum)*interest*100)/100).toFixed(2);

      计算结果:0.01

      原因:toFixed它是一个四舍六入五成双的诡异的方法,"四舍六入五成双"含义:对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)  

    2.发现问题后我就换了一种方法[Math.round()],这种方法避免了上面的问题:

      计算方式:value = Math.round((howMuch-allow_sum)*interest*100)/100;

      计算结果:0.02

      虽然避免了上面的问题,在特定的情况下有引发了新的问题,比如:

        howMuch = 119;

        allow_sum = 100;

        计算方式:value = Math.round((howMuch-allow_sum)*interest*100)/100;

        计算结果:计算出来的是(119-100)*0.005 = 0.095,四舍五入就变成了0.1了,而业务需求是小数点后面两位,也就是0.10

    3.发现上一个问题后,我决定把两个方法结合起来使用:

      计算方式:value = (Math.round((howMuch-allow_sum)*interest*100)/100).toFixed(2);

      计算结果:计算出来的是(119-100)*0.005 = 0.095,四舍五入后是0.10,刚好符合业务的要求

    写的不对的地方,欢迎留言指正,谢谢!

  • 相关阅读:
    Win7双击任务栏图标导致窗口还原的问题
    一致性哈希算法及其在分布式系统中的应用(转)
    CAP理论(转)
    从Android界面开发谈起(转)
    Android开发入门之Window 环境概念介绍(转)
    数据库缓存技术(转)
    VoltDB开篇 简介(转)
    window下如何让php支持openssl(转)
    mysql分表的3种方法(转)
    linux crontab 每10秒执行一次
  • 原文地址:https://www.cnblogs.com/zengguowang/p/5981626.html
Copyright © 2011-2022 走看看