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

银行的盈利模式是什么?三个字:信息差!从储户手中收拢资金,然后放贷出去,而所谓的”利润”就是这其中的利息差额。
在我国,人民银行规定每个季度月末的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)

大家都在看

  • 十七、JDK8 新特性(更新)

    十七、JDK8 新特性 17.1 JDK8新特性分类 前面已经学过的JDK8新特性介绍: ✅默认方法:见10.8.2 接口的语法 ✅新的日期API:见13.9.3 第三代日期类 L…

    技术杂谈 2023年7月11日
    0139
  • [报错]-NameError: name ‘NAN’ is not defined

    部分数据输出为NaN,处理这部分异常数据使用 isnan()函数 方法一:使用np.nan import numpy as np if z == np.nan: print(‘er…

    技术杂谈 2023年7月10日
    070
  • InnoDB中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    技术杂谈 2023年7月24日
    060
  • java读写锁

    工作遇到了金钱计算,需要用到读写锁保证数据安全。记录一下。 单纯读没有限制,读写、写写的时候会有安全问题。 _hashMap_存在并发线程安全问题,而 _hashtable_线程安…

    技术杂谈 2023年7月24日
    070
  • Dubbo学习

    Dubbo 前言 1.1 大型互联网项目架构目标 1.2 集群和分布式 概念 集群:很多”人”一起,干一样的事。 一个业务模块,部署在多台服务器上。 分布式…

    技术杂谈 2023年6月21日
    092
  • Django显示本地图片,注意事项

    1、在url.py文件中的配置 导入相关的库,在Python2.0后,要用re_path from django.urls import path,re_path from dja…

    技术杂谈 2023年7月24日
    096
  • 期末求加分

    信2005-3班 20203910 陈振辉 和王建民老师度过了一个愉快的学期,期末希望成绩能加分,申请理由如下: 1.在第一次课上动手又动脑中,第一阶段班级达到前15名提交要求。 …

    技术杂谈 2023年6月21日
    052
  • jprofiler 提供的几个方便工具

    jprofiler 不只是可以在启动时添加agent信息,运行时态也是可以了,官方提供了不少工具 几个有用的工具 jpenable 可以jprofiler 的进程附加,可以方便jp…

    技术杂谈 2023年5月30日
    098
  • 千古前端图文教程-HTML005-HTML标签:字体标签和超链接

    HTML标签:字体标签和超链接 HTML标签:字体标签和超链接 本文主要内容 #字体标签 #特殊字符(转义字符) #下划线、中划线、斜体 粗体标签 或 (已废弃) #字体标签 &l…

    技术杂谈 2023年7月11日
    0117
  • dremio odbc 驱动包下载说明

    dremio 就在5月底左右的时候,对于odbc 驱动停止了下载,目前在dremio 社区网站有不大好人员反馈了,总的来说是很不好对于数据处理领域基于python (会使用到odb…

    技术杂谈 2023年5月30日
    0142
  • 一本软考教材,治好了我多年的低血压

    事情是这样的,最近想要考一个高级软件资格证书,于是二话不说买了”信息系统项目管理师”相关资料就开始学起来了。教材一到手,刚翻开第一页读了个序言,曾经熟悉的味…

    技术杂谈 2023年7月11日
    064
  • 如何搭建android源代码repo仓库

    .版本: v0.3作者:河东西望日期:2022-7-5. 如果你的开发是基于AOSP源码来建仓,那么搭建repo服务器和部署自己的repo仓库就是非常必要的工作了。 现实中很多公司…

    技术杂谈 2023年6月21日
    083
  • C++ 虚基类与虚继承 (菱形继承问题)

    C++ 是支持多继承的语言, 但是实际项目开发中非必要不要使用多继承以降低代码逻辑的复杂性,当然 C++ 多继承的特性带来一些问题即 菱形继承。 当一个类继承了两个来自同父类的子类…

    技术杂谈 2023年6月21日
    093
  • Axis1.4 调用.net服务出错

    1 出错描述: AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client faultSubcod…

    技术杂谈 2023年7月24日
    076
  • 编程初学者如何使用搜索引擎

    或许你会认为这篇文章的内容极为基础。事实上,我也是这么觉得的。但从很多同学的留言来看,还是有必要简单地科普一下,分享我的一点”搜索”经验。 如果你在学习编程…

    技术杂谈 2023年7月25日
    078
  • [转帖]Instrument API介绍

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

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