在金融服务计算中,必须要使用BigDecimal

在Java程序开发过程中,比较初级(工作经验受限)的开发人员,把注意力全部放在了一些高大上的新技术中,往往忽略了一些初级问题。、

 

金融服务系统中,对金额的敏感至关重要,账户余额、还款金额、代收本金、代收收益等的计算,都会涉及到小数位精度问题。

 

首先,我们理解小数位数据类型为浮点类型。

 

字节:

一个英文字符,占一个字节,即8位(bite),计算机中的最小储存单元是位(bite),即存的是0或1。

 

float:

单精度类型,精度是8位有效数字,内存分配4个字节,取值范围从 10^-38到10^38 和 -10^38到-10^-38。

float在计算机中占32位,1bit(符号位),8bits(指数位)、指数范围(-128 ~ +127),23bits(尾数位),范围(-2^128 ~ +2^127,-3.40E+38 ~ +3.40E+38)。

经测试:取值范围,最小值:1.4E-45、最大值:3.4028235E38

 

double:

双精度类型,精度是17位有效数字,内存分配8个字节,取值范围从 10^-308到10^308 和 -10^308到-10^-308。

double在计算机中占64位,1bit(符号位),11bits(指数位)、指数范围(-1024 ~ +1023),52bits(尾数位),范围(-2^1024 ~ +2^1023,-1.79E+308 ~ +1.79E+308)。

经测试:取值范围,最小值:4.9E-324、最大值:1.7976931348623157E308

 

在计算表达式(a - b)的过程中,a = 2,b = 1.1,小学生都知道答案是0.9,结果程序计算出来的结果是0.89999......,首先计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换成十进制输出,double和float提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近与原本的值,这就导致了你看到的不正确的结果。

 

而BigDecimal可以表示任意精度的小数,并对它们进行计算。但要小心使用BigDecimal(double)构造函数,因为它会在计算的过程中产生舍入误差。最好要使用基于整数或String的构造函数来创建BigDecimal对象。

 

BigDecimal比较

 

 1 public static void main(String[] args) {
 2 
 3     BigDecimal a = new BigDecimal("0.89");
 4     BigDecimal b = new BigDecimal("1.23");
 5     BigDecimal c = new BigDecimal("0.89");
 6 
 7     int result1 = a.compareTo(b);
 8     int result2 = a.compareTo(c);
 9     int result3 = b.compareTo(a);
10 
11     System.out.println(result1);
12     System.out.println(result2);
13     System.out.println(result3);
14 
15 }

 

程序运行结果:

输出:-1(左边比右边小)、0(相等)、1(左边比右边数大)。

使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。

转载于:https://www.cnblogs.com/focus-yun/p/10654036.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值