关于金融类数据运算的技术总结

金融数据运算精讲:BigDecimal类的使用与舍入模式
本文介绍了金融类数据运算中为确保精度使用BigDecimal类的方法,包括加减乘除运算,并详细阐述了BigDecimal的8种舍入模式,如ROUND_UP、ROUND_DOWN等,通过实例展示了各种模式下如何处理小数位的取舍。

很多人在做运算的时候都会运用Int类型或Integer 类型,但是这些数据类型的运算会有精度的缺失。对于金融类的数据运算由于要精确的数字,因此必须要保证每一个运算的小数位都是准确的,那么就需要用到BigDecimal类。

下面就介绍一下BigDecimal类的加减乘除运算及小数位的取舍。

1.BigDecimal类的加减乘除运算函数分别是:

加:add()

减:subtract()

乘:multiply()

除:divide()


举例:

//加法运算
BigDecimal b1 = new BigDecimal(12.021); 
BigDecimal b2 = new BigDecimal(14.434); 
BigDecimal result =b1.add(b2); 
System.out.println("加法:result = " + result);

//减法运算
BigDecimal result2 =b1.subtract(b2);
System.out.println("减法:result2 = " + result2);


//乘法运算
BigDecimal result3 =b1.multiply(b2);
System.out.println("乘法:result3 = " + result3);

//除法运算
BigDecimal result4 =b1.divide(b2,2);
System.out.println("除法:result4 = " + result4);

输出结果:

加法:result = 26.4550000000000000710542735760100185871124267578125
减法:result2 = -2.4129999999999984794385454733856022357940673828125
乘法:result3 = 173.51111400000000277442779861303221499893728297191420099042369340480718165053986012935638427734375
除法:result4 = 0.8328252736594153664542726461514208417319956721


2.小数位的取舍

BigDecimal的小数位取舍共有8种模式,分别如下:

1、ROUND_UP  舍入远离零的舍入模式。
在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
注意,此舍入模式始终不会减少计算值的大小。

2、ROUND_DOWN  接近零的舍入模式。
在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
注意,此舍入模式始终不会增加计算值的大小。

3、ROUND_CEILING  接近正无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
如果为负,则舍入行为与 ROUND_DOWN 相同。
注意,此舍入模式始终不会减少计算值。 


4、ROUND_FLOOR  接近负无穷大的舍入模式。
如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
如果为负,则舍入行为与 ROUND_UP 相同。
注意,此舍入模式始终不会增加计算值。

5、ROUND_HALF_UP  四舍五入(使用频率较高)
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
其实就是四舍五模式。

6、ROUND_HALF_DOWN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。  
此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。

8、ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。
如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。


举例:

//四舍五入
BigDecimal b11 = new BigDecimal("15.42156"); 
System.out.println("ROUND_CEILING: " + b11.setScale(2,BigDecimal.ROUND_CEILING)); 
System.out.println("ROUND_DOWN: " + b11.setScale(2,BigDecimal.ROUND_DOWN)); 
System.out.println("ROUND_FLOOR: " + b11.setScale(2,BigDecimal.ROUND_FLOOR)); 
System.out.println("ROUND_HALF_DOWN: " + b11.setScale(2,BigDecimal.ROUND_HALF_DOWN)); 
System.out.println("ROUND_HALF_EVEN: " + b11.setScale(1,BigDecimal.ROUND_HALF_EVEN)); 
System.out.println("ROUND_HALF_UP: " + b11.setScale(2,BigDecimal.ROUND_HALF_UP)); 
System.out.println("ROUND_UNNECESSARY: " + b11.setScale(5,BigDecimal.ROUND_UNNECESSARY)); ------不需要取舍小数位
System.out.println("ROUND_UP: " + b11.setScale(2,BigDecimal.ROUND_UP)); 

输出结果:

ROUND_CEILING: 15.43
ROUND_DOWN: 15.42
ROUND_FLOOR: 15.42
ROUND_HALF_DOWN: 15.42
ROUND_HALF_EVEN: 15.4
ROUND_HALF_UP: 15.42
ROUND_UNNECESSARY: 15.42156
ROUND_UP: 15.43


希望以上会对迷茫的你有所帮助。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值