打字猴:1.700440346e+09
1700440346
1700440347 0.000+0.001+0.002+0.003+0.004-0.005-0.004-0.003-0.002-0.001=-0.005
1700440348
1700440349 也就是说,每10笔的利息计算中就损失0.005元,即每笔利息计算损失0.0005元,这对一家有5千万储户的银行来说(对国内的银行来说,5千万是个很小的数字),每年仅仅因为四舍五入的误差而损失的金额是:
1700440350
1700440351 public class Client{
1700440352
1700440353 public static void main(String[]args){
1700440354
1700440355 //银行账户数量,5千万
1700440356
1700440357 int accountNum=5000*10000;
1700440358
1700440359 //按照人行的规定,每个季度末月的20日为银行结息日
1700440360
1700440361 double cost=0.0005*accountNum*4;
1700440362
1700440363 System.out.println(“银行每年损失的金额:”+cost);
1700440364
1700440365 }
1700440366
1700440367 }
1700440368
1700440369 输出的结果是:“银行每年损失的金额:100000.0”。即,每年因为一个算法误差就损失了10万元,事实上以上的假设条件都是非常保守的,实际情况可能损失得更多。那各位可能要说了,银行还要放贷呀,放出去这笔计算误差不就抵消掉了吗?不会抵销,银行的贷款数量是非常有限的,其数量级根本没有办法和存款相比。
1700440370
1700440371 这个算法误差是由美国银行家发现的(那可是私人银行,钱是自己的,白白损失了可不行),并且对此提出了一个修正算法,叫做银行家舍入(Banker’s Round)的近似算法,其规则如下:
1700440372
1700440373 舍去位的数值小于5时,直接舍去;
1700440374
1700440375 舍去位的数值大于等于6时,进位后舍去;
1700440376
1700440377 当舍去位的数值等于5时,分两种情况:5后面还有其他数字(非0),则进位后舍去;若5后面是0(即5是最后一个数字),则根据5前一位数的奇偶性来判断是否需要进位,奇数进位,偶数舍去。
1700440378
1700440379 以上规则汇总成一句话:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。我们举例说明,取2位精度:
1700440380
1700440381 round(10.5551)=10.56
1700440382
1700440383 round(10.555)=10.56
1700440384
1700440385 round(10.545)=10.54
1700440386
1700440387 要在Java 5以上的版本中使用银行家的舍入法则非常简单,直接使用RoundingMode类提供的Round模式即可,示例代码如下:
1700440388
1700440389 public class Client{
1700440390
1700440391 public static void main(String[]args){
1700440392
1700440393 //存款
1700440394
1700440395 BigDecimal d=new BigDecimal(888888);
[ 上一页 ]  [ :1.700440346e+09 ]  [ 下一页 ]