“银行家算法”大揭秘!在前端表格中利用自定义公式实现“四舍六入五成双”

银行的盈利模式是什么?三个字:信息差!从储户手中收拢资金,然后放贷出去,而所谓的”利润”就是这其中的利息差额。
在我国,人民银行规定每个季度月末的20号为银行结息日,每一年四次结息,因此每年需要非常频繁的计算付给储户的利息。在计算利息时,小数点如何处理就变得很重要,并成为决定利润多少的关键细节。

“银行家算法”大揭秘!在前端表格中利用自定义公式实现“四舍六入五成双”

(图片来自于网络)

通常,我们都知道在保留小数点的时候,常常会用到四舍五入。小于5的数字被舍去,大于等于5的数字进位后舍去,由于所有位上的数字都是自然计算出来的,按照概率计算可知,被舍入的数字均匀分布在0到9之间。
我们不妨以10笔存款利息计算作为模型,以银行家的身份来思考这个算法:

四舍,舍弃的值包含: 0.000、0.001、0.002、0.003、0.004,对银行而言舍弃的内容就不再需要支付,所以舍弃的部分我们可以理解为”赚到了”。

五入,进位的内容包括:0.005、0.006、0.007、0.008、0.009,对银行而言进位内容会造成亏损,对应亏损的金额则是: 0.005、0.004、0.003、0.002、0.001。
因为舍弃和进位的数字是在0到9之间均匀分布的,所以对于银行家来说,每10笔存款的利息因采用四舍五入而获得的盈利是:
0.000 + 0.001 + 0.002 + 0.003 + 0.004 – 0.005 – 0.004 – 0.003 – 0.002 – 0.001 = -0.005
总体来讲每10笔的利息,通过四舍五入计算就会导致0.005元的损失,即每笔利息计算损失0.0005元。假设某家银行有5千万储户,每年仅仅因为四舍五入的误差而损失的金额是:

public class Client {
     public static void main(String[] args) {
          //银行账户数量,5千万
          int accountNum =5000*10000;
          //按照人行的规定,每个季度末月的20日为银行结息日
          double cost = 0.0005 * accountNum * 4 ;
          System.out.println("银行每年损失的金额:" + cost);
     }
}

计算结果是:”银行每年损失的金额:100000.0″。你可能难以相信,四舍五入小小一个动作,就导致了每年损失10万。但在真实环境中,实际损失可能事更多。
这个情况是由美国的私人银行家发现,为了解决这一情况提出了一个修正算法:
“舍去位的数值小于5时,直接舍去;
舍去位的数值大于等于6时,进位后舍去;
当舍去位的数值等于5时,分两种情况:5后面还有其他数字(非0),则进位后舍去;若5后面是0(即5是最后一个数字),则根据5前一位数的奇偶性来判断是否需要进位,奇数进位,偶数舍去。”
以上这么多,汇成一句话就是:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。
我们举例说明,取2位精度:
10.5551= 10.56
10.555= 10.56
10.545= 10.54

“银行家算法”大揭秘!在前端表格中利用自定义公式实现“四舍六入五成双”

(图片来自于网络)

简单来说,有了”四舍六入五成双”这样的银行家算法,就可以更为科学精确地处理数据。

在实际应用中,我们使用银行家算法最多的情况就是在大数据量的表格计算中,但是在表格计算中需要通过一系列的内置公式进行复合。对于普通用户来说无论是理解还是最终使用,都很繁琐且复杂。
为了更加方便地解决这个问题,我们可以通过自定义函数来完成这样的需求,这样用户只需要记住自定义的函数名即可使用具有这样一个规则的函数。
接下来我们一起看看,如何在前端表格中快速地实现”四舍六入五成双”。
我们首先需要定义函数的名称,以及里面的参数数目。因为我们想要实现的是,传递两个参数,”1″是需要被约修的数值,”2″是保留小数点后面的位数,根据值和位数进行约修。

var FdaFunction = function() {
             this.name = "FDA";
             this.minArgs = 1;
             this.maxArgs = 2;
         };

接下来就是为了方便用户理解和使用,我们需要对这个自定义函数添加一些描述:

 FdaFunction.prototype.description = function() {
             return {
                 description: "对value进行四舍六入五留双修约,保留小数点后指定位数",
                 parameters: [{
                     name: "value",
                     repeatable: false,
                     optional: false
                 }, {
                     name: "places",
                     repeatable: false,
                     optional: false
                 }]
             }
         }

最后到了关键步骤,也就是函数的逻辑运行都放在evaluate中,我们会对传入的值做一些判断,并且会利用正则表达式做一些匹配。要实现”五成双”,那么我们还要对需要约修的最后一个位值做判断,来决定是否进位。具体可以参考附件完整的demo。

         FdaFunction.prototype.evaluate = function(context, num, places) {

            if (!isNaN(parseInt(num)) && !isNaN(parseInt(places))) {
                console.log("evaluate")
                 num = numGeneral(num);
                if (!isNumber(num)) {
                    return num;
                }
                var d = places || 0;
                var m = Math.pow(10, d);
                var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
                var i = Math.floor(n),
                    f = n - i;
                var e = 1e-8; // Allow for rounding errors in f
                var r = f > 0.5 - e && f < 0.5 + e ? (i % 2 == 0 ? i : i + 1) : Math.round(n);
                var result = d ? r / m : r;

                if (places > 0) {
                    var s_x = result.toString();
                    var pos_decimal = s_x.indexOf(".");
                    if (pos_decimal < 0) {
                        pos_decimal = s_x.length;
                        s_x += ".";
                    }
                    while (s_x.length <= pos_decimal + places) { s_x ; } return s_x; else result; }else{ "#value!"; < code></=>

体验下载完整demo:
https://gcdn.grapecity.com.cn/forum.php?mod=attachment&aid=MTkyNjA3fDQzMTk2ZmRhfDE2NTAyNzI0NTV8NjI2NzZ8MTQxNjY4

大家如果想了解更多与自定义公式相关内容,可以查看链接:
https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/features/calculation/custom-functions/purejs

Original: https://www.cnblogs.com/powertoolsteam/p/16257609.html
Author: 葡萄城技术团队
Title: “银行家算法”大揭秘!在前端表格中利用自定义公式实现“四舍六入五成双”

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545452/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 为什么人们都讨厌开会?

    原创不易,求分享、求一键三连 会议是工作中最重要的组成部分,因为他需要解决两个核心难题: 信息传递; 达成一致; 有效的信息传递是战略落地的前提条件,更多的认知统一更是可以加速成功…

    技术杂谈 2023年6月1日
    0117
  • 李卓豪:网易数帆数据中台逻辑数据湖的实践

    导读: 本文将介绍过去15年中,网易大数据团队在应对不断涌现的新需求、新痛点的过程中,逐渐形成的一套逻辑数据湖落地方法。内容分为五部分: 关于网易数帆 为什么做逻辑数据湖 怎么做逻…

    技术杂谈 2023年7月25日
    0118
  • golang 笔记

    for循环,一个key在一个map中,则一直迭代 go总是使用值传递,但是有些数据类型是引用类型,比如map, pointer, channel, slice是部分引用类型 在给函…

    技术杂谈 2023年7月11日
    074
  • Spark搭建

    7、测试及使用 切换目录: cd /usr/local/soft/spark-2.4.5/examples/jars Spark on Yarn Client模式:日志在本地输出,…

    技术杂谈 2023年7月11日
    073
  • 使用ThreadLocal请务必remove

    特别注意,web容器的线程是重复使用的,web容器使用了线程池,当一个请求使用完某个线程,该线程会放回线程池被其它请求使用,这就导致一个问题,不同的请求还是有可能会使用到同一个线程…

    技术杂谈 2023年5月31日
    082
  • 今天把HP6520S笔记本给拆解了

    今天把HP6520S笔记本给拆解了 两年前买的爱机 HP 6520s,实在欢喜的不得了,但随着每天15小时左右的高负荷工作,爱机 最近的风扇声音也开始烦躁起来了,且一天叫个不停,难…

    技术杂谈 2023年7月11日
    086
  • Java动手又动脑-数组1

    ; ; 动手又动脑数组第一阶段 posted @2022-03-18 07:52 HelloHui 阅读(10 ) 评论() 编辑 Original: https://www.cn…

    技术杂谈 2023年6月21日
    0116
  • Vue前端框架基础+Element的使用

    前置内容: AJAX基础+Axios快速入门+JSON使用 1、VUE 1.1 概述 1.2 快速入门 1.3 Vue指令 1.3.1 v-bind & v-model 指…

    技术杂谈 2023年7月25日
    086
  • 账号分享

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年6月22日
    0109
  • 1.Spring Boot 的认识

    以前开发我们都是使用springMVC去开发,但是现在我们全部已经使用springboot了,因为它很方便,我也是便于从头梳理一下springboot,让自己更加深入了结sprin…

    技术杂谈 2023年7月24日
    086
  • Redis命令操作_常用命令和Redis持久化

    通用命令 keys * 查询所有的键 type key:获取键对应的value的类型 del key:删除指定的key clear:清除窗口所有内容 127.0.0.1:6379&…

    技术杂谈 2023年6月21日
    0118
  • CentOS安装NodeJS

    NodeJS 构建VUE项目 这部分很基础,网上很多教程 yum install -y wget 如果已经安装了可以跳过该步 在https://nodejs.org/en/down…

    技术杂谈 2023年6月1日
    092
  • PowerBI 开发 第22篇:异常检测(Anomaly Detection)

    异常检测通过自动检测时间序列数据中的异常来增强折线图,并且提供了异常解释,以帮助用户进行根本原因的分析。异常检测只能用于Line Chart中,并且必须有Date字段作为X坐标轴,…

    技术杂谈 2023年5月31日
    0122
  • Shopify Atlantic主题模板配置修改

    Shopify Atlantic主题是一个经受住了时间考验的经典 Shopify 主题,引人注目、可扩展且专为提高转化率而打造‎。使用经过验证的灵活主题建立您的业务,以帮助商店发展…

    技术杂谈 2023年5月31日
    095
  • Servlet之Request和Response的快速上手

    阅读提示: 前置内容 MyBatis知识点总结 HTTP和Servlet入门 1、Request和Response概述 2、Request对象 2.1 Request继承体系 2….

    技术杂谈 2023年7月25日
    092
  • 我的大一总结

    图片不太清楚这里附上链接密码: w98f https://udld.github.io/ (老师总结)大一内容总结 编程语言初级使用 C,java (python 未完成) Lin…

    技术杂谈 2023年7月23日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球