银行家舍入法(银行家算法),其实质是一种四舍六入五取偶(又称四舍六入五留双)法。
银行家舍入法是由IEEE 754标准规定的浮点数取整算法,大部分的编程软件都使用的是这种方法。 相较于四舍五入法,银行家舍入法舍入会更加精准。
具体计算规则
1、被修约的数字小于5时,该数字舍去;
2、被修约的数字大于5时,则进位;
3、被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
优势
在对大量的数据进行舍入之后,银行家舍入相较于四舍五入会更精准、更公平。
银行家舍入法 | |||
舍入位 | 处理 | 例子(保留两位小数) | |
0-4 | 舍去 | 2.121->2.12 | |
5(没有尾数) | 前一位是偶数 | 舍去 | 2.125->2.12 |
前一位是奇数 | 进位 | 2.135->2.14 | |
5(有尾数) | 进位 | 2.1351->2.14 | |
6-9 | 进位 | 2.127->2.13 |
BigDecimal支持
BigDecimal支持四舍六入银行家算法,使用
BigDecimal.ROUND_HALF_EVEN参数在构造BigDecimal传入即可实现
BigDecimal bigDecimal = new BigDecimal("2.115");
BigDecimal newBigDecimal = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(newBigDecimal.toString()); //输出2.12
BigDecimal bigDecimal = new BigDecimal("2.125");
BigDecimal newBigDecimal2 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(newBigDecimal2.toString()); //输出2.12
本文暂时没有评论,来添加一个吧(●'◡'●)