码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-04-04 12:58:15      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:alt   div   float   答案   服务   jpg   重要   对象   整数   

在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差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。

技术图片

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

标签:alt   div   float   答案   服务   jpg   重要   对象   整数   

原文地址:https://www.cnblogs.com/focus-yun/p/10654036.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!