BigDecimal在⾦额计算中的注意事项
BigDecimal的基本⽤法这⾥不做说明,加减乘除运算都是最基本的,直接查看jdk源码即可。
除法运算
在基本运算中需要额外注意的是除法运算,除法运算中存在两种特殊的情况:
除数为零:bigdecimal除法保留小数
除不尽:
运算的结果依然是BigDecimal类型,⽆限循环的数字⽤BigDecimal是⽆法精确表⽰的,所以遇到这种情况如果没有设置保留进度会抛出异常的。
因此在除法运算中,⼀定记得 判断除数 和 设置精度。
四舍五⼊问题
在⾦额计算中,如果是⼈民币币种,⼀般我们的做法是精确到分级别,⽐如转账或者红包也都是这个精确度,但计算过程中的中间值和结果经常是超过两位⼩数的精度,因此必须做四舍五⼊。
在四舍五⼊中⼀般使⽤银⾏家算法,银⾏家算法是经过统计学验证的⾮亏损式的算法,是有利于⾦融⽅的⼀种算法,如需了解请⾃⾏百度。
确定⼀种舍⼊模式并定义为常量:在代码中⽤到的地⽅直接使⽤该常量,这样以后即使改了,可以做到统⼀修改。
负数的舍⼊问题: 在负数的情况不同的舍⼊⽅法会出现⾮预期的情况,例如:正数的1.445 => 1.45,⽽负数的 -1.445 => -1.44,在特定的模式下会出现这种⾮预期的结果,因此建议所有的舍⼊都基于正数来舍⼊,然互再使⽤取反运算获得舍⼊后的数值。