闲话银行家舍入法,以及在程序中如何实现

简介: 闲话银行家舍入法,以及在程序中如何实现

前言

相信对于四舍五入的舍入法,大家都耳熟能详,但对于银行家舍入法,可能就会比较少接触了!

可是在金融界,银行家舍入法可是大名鼎鼎的主角之一,主要应用于金融领域和涉及货币计算的场合。

那么,这个银行家舍入法是什么呢?它是怎么来的?有什么规则?……

别急,请听我一一道来。

银行家舍入法的来源

银行的盈利渠道主要是利息差,它从储户手里收集资金,然后放贷出去,期间产生的利息差就是银行所获得的利润。

如果采用平常四舍五入的规则,假设采用每 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、.003、0.002、0.001。

对于银行来说它的盈利应该是

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 元,千万别小看这个数字,这对于银行来说就是一笔非常大的损失。

美国银行家对金钱是最敏感的,他们首先发现了这个问题,所以他们提出这个算法,用于修正采用上面四舍五入规则而产生的误差。

银行家舍入法的规则

银行家舍入法的规则,简单地说,就是 四舍六入五成双

如何理解呢?举个例子,假设要保留两位小数,

  1. 如果第三位小数大于 5,那么进一位,比如 11.556 = 11.56
  2. 如果第三位小数小于 5,那么舍去,比如 11.554 = 11.55
  3. 如果第三位小数等于 5,并且有第四位小数,那么进一位,比如 11.5551 = 11.56
  4. 如果第三位小数等于 5,没有第四位小数,那么有两种情况:
  • 如果第二位小数是偶数,那么舍去,比如 11.545 = 11.54
  • 如果第二位小数是奇数,那么进一位,比如 11.555 = 11.56

如何在程序中实现银行家舍入法

  1. Java 内置了银行家舍入法的方法,可以直接使用 RoundingMode.HALF_EVEN 来实现,代码如下:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Main {
  public static void main(String[] args) {
    // 假设要将 2.34567 保留两位小数
    double num = 2.34567;
    BigDecimal bd = new BigDecimal(num);
    BigDecimal rounded = bd.setScale(2, RoundingMode.HALF_EVEN);
    
    System.out.println("使用银行家舍入法保留两位小数:" + rounded);
  }
}

2.C# 也内置了银行家舍入法的方法,可以使用 Math.Round 方法结合 MidpointRounding.ToEven 参数来实现,代码如下:

using System;
class Program
{
  static void Main()
  {
    // 定义一个 double 类型的数值
    double amount = 10.555;
    // 使用 Math.Round 方法进行银行家舍入法
    double roundedAmount = Math.Round(amount, 2, MidpointRounding.ToEven);
    // 输出结果
    Console.WriteLine($"原始数值: {amount}");
    Console.WriteLine($"银行家舍入后的结果: {roundedAmount}");
  }
}

总结

这些银行家们真是精明得很啊,一点亏都不肯吃的 _

往期精彩

  1. 浅论未来 IT 和财务结合的趋势

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊程序人生,共同学习,共同进步


相关文章
|
6月前
|
存储 编译器 C++
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用(一)
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用
86 2
|
6月前
|
C++
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用(二)
【软件设计师备考 专题 】设计语言的基本成分:数据、运算、控制和传输,过程(函数)调用
75 2
|
5月前
|
Java Go Windows
go语言实现加减法出题器(再也不用担心孩子学习了)
go语言实现加减法出题器(再也不用担心孩子学习了)
|
6月前
|
C语言 C++
异或运算的骚操作,由浅入深拿捏一类型的题
异或运算的骚操作,由浅入深拿捏一类型的题
111 1
|
算法 C++
【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念
【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念
115 0
蓝桥杯之多界面切换处理(枚举加状态机法)
蓝桥杯之多界面切换处理(枚举加状态机法)
123 0
|
存储 Java 数据安全/隐私保护
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
《我要进大厂》- Java基础夺命连环10问,你能坚持到第几问?(面向对象基础篇)
|
IDE Java 编译器
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)(二)
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)(二)
|
Rust Oracle Java
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)(一)
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)(一)
|
存储 缓存 Java
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)(三)
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)
《我要进大厂》- Java基础夺命连环18问,你能坚持到第几问?(基础概念 | 基本语法 | 基本数据类型)(三)