“银行家算法”揭晓!银行在前端表中使用自定义公式的盈利模式是什么?“就是那里面的利差。在我国,人民银行规定,每季度末的20日为银行的结息日,一年结息四次。所以,支付给银行的利息储户每年都需要非常频繁地计算,在计算利息的时候,小数点如何处理就变得非常重要,成为决定利润的关键细节。(图片来自网络)通常我们都知道四舍五入往往是保留小数点时使用。小于5的数字四舍五入,大于或等于5的数字四舍五入。由于所有数字都是自然计算的,根据概率计算,四舍五入的数字均匀分布在0到9之间。我们不妨以10次存款利息计算为模型,把这个算法想象成银行家:四舍五入,舍弃值包括:0.000、0.001、0.002、0.003、0.004,舍弃ed的内容对于银行支付已经不需要了,所以我们可以把丢弃的部分理解为“赚”。五项,进位内容包括: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元。假设一家银行有5000万存款人,每年因为四舍五入而损失的金额为:publicclassClient{publicstaticvoidmain(String[]args){//银行账户数,5000万intaccountNum=5000*10000;//按照中国人民银行规定,每季度最后一个月的20日为银行结息日doublecost=0.0005*accountNum*4;System.out.println("每年银行亏损额:"+cost);}}计算结果为:“每年银行亏损额:100000.0”。你可能很难相信一个小的舍入动作会导致每年损失100,000。但在真实环境中,实际损失可能更多。这种情况是美国一位私人银行家发现的。为了解决这种情况,提出了修改后的算法:“当四舍五入的数字小于5时,直接四舍五入;当四舍五入的数字大于等于6时,舍去后舍弃thecarry;当四舍五入的数字的值等于5时,有两种情况:如果5后面还有其他数字(非零),则进位后舍弃;如果5后面跟着0(即5是最后一位),则根据前一位的奇偶性来判断是否需要进位,奇数进位,偶数舍弃。上面这么多可以一句话概括:四舍五入考虑,五后不为零则进一,五后为零看奇偶,第一个偶数应舍弃五个,奇数应舍入第五个。举个例子说明一下,取2位数的精度:10.5551=10.5610.555=10.5610.545=10.54(图片来自网络)简单的说,用银行家算法比如“50四舍五入成双”,可以更科学精确处理数据。在实际应用中,我们最常在数据量大的表格计算中使用银行家算法,但是在表格计算中,需要一系列内置的公式来进行复利。对于普通用户来说,无论是理解还是最终使用,都是繁琐复杂的。为了更方便的解决这个问题,我们可以通过一个自定义函数来实现这个需求,这样用户只需要记住自定义函数名就可以使用具有这样规则的函数。下面我们就来看看如何在前端表格中快速实现“五进八出”。我们首先需要定义函数的名称,以及其中的参数个数。因为我们要实现的是传递两个参数,“1”是需要减去的值,“2”是小数点后的位数,根据值和个数进行减去的数字。varFdaFunction=function(){this.name="FDA";这个.minArgs=1;这个.maxArgs=2;};接下来,为了方便用户理解和使用,我们需要为这个自定义函数添加一些说明:小数点",parameters:[{name:"value",repeatable:false,optional:false},{name:"places",repeatable:false,optional:false}]}}终于到了关键的一步,即函数的逻辑运算放在evaluate中,我们会对传入的值做一些判断,并且会用正则表达式做一些匹配。要做到“50%翻倍”,那么我们就要对最后需要修改的bit值做一个判断,决定是否进位。详情请参考附件中的完整demo。FdaFunction.prototype.evaluate=function(context,num,places){if(!isNaN(parseInt(num))&&!isNaN(parseInt(places))){console.log("evaluate")num=numGeneral(num);如果(!isNumber(num)){返回num;}vard=地点||0;varm=Math.pow(10,d);varn=+(d?num*m:num).toFixed(8);//避免舍入错误vari=Math.floor(n),f=n-i;vare=1e-8;//允许f中的舍入误差varr=f>0.5-e&&f<0.5+e?(i%2==0?i:i+1):Math.round(n);变量结果=d?r/m:r;if(places>0){vars_x=result.toString();varpos_decimal=s_x.indexOf(".");如果(pos_decimal<0){pos_decimal=s_x.length;s_x+=".";}while(s_x.length<=pos_decimal+places){s_x+="0";}返回s_x;}else{返回结果;}}else{返回“#VALUE!”;完整的demo下载体验:https://gcdn.grapecity.com.cn...如果想了解更多自定义公式,可以查看链接:https://demo.grapecity。com.cn...延伸阅读SpreadJS纯前端表单控件
