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,刚好符合业务的要求

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

  • 相关阅读:
    Window下安装redis
    Redhat安装python环境(readline模块)
    Golang之hello,beego
    Golang之go 命令用法
    Golang之Mysql事务
    Golang之waitgroup用法
    记录java版本不兼容的坑,(kafka运行报错)
    位运算的技巧(有拓展的技巧)
    关于单片机软件框架的一点思考
    解决main.o(.data) type RW incompatible with bsp.o(.ARM.__AT_0x24001000) type ZI in er RW_IRAM2.(转载)
  • 原文地址:https://www.cnblogs.com/zengguowang/p/5981626.html
Copyright © 2011-2022 走看看