在金融服务计算中,必须要使用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比较
public static void main(String[] args) { BigDecimal a = new BigDecimal("0.89");
BigDecimal b = new BigDecimal("1.23");
BigDecimal c = new BigDecimal("0.89"); int result1 = a.compareTo(b);
int result2 = a.compareTo(c);
int result3 = b.compareTo(a); System.out.println(result1);
System.out.println(result2);
System.out.println(result3); }
程序运行结果:
输出:-1(左边比右边小)、0(相等)、1(左边比右边数大)。
使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。
最新文章
- js闭包Demo
- spring 初始化之后执行的方法
- java 访问 usb
- 转:45 个 LoadRunner 面试问题(附答案)_纯英文,太有逼格了
- 简易servlet计算器
- 分享一款简洁的jQuery轮播源码
- 不需要软件让Windows7变身WIFI热点
- mysql编码和Java编码相应一览表
- AttributeError: 'module' object has no attribute 'Thread'
- 基本功能的shell
- angularjs ng-class
- Hibernate框架进阶(中篇)之多表关系
- Spring读取外部属性-properties
- 真正从零开始,TensorFlow详细安装入门图文教程!
- ORACLE导入大量数据的两种方式比较
- JAVA百度过的异常(1)
- Android SDK + Appium 环境搭建
- 【centos】 error: command 'gcc' failed with exit status 1
- 使用python中的matplotlib 画图,show后关闭窗口,继续运行命令
- dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析 (转)
热门文章
- localStorage跟cookie的使用
- <;pre>; <;textarea>; <;code>;标签区别
- Unable to update index for central http://repo1.maven.org/maven2/ 解决方法
- 自定义Windows Form无法拖动,简单解决方案。
- .NET开源论坛MvcForum推荐
- LintCode2016年8月22日算法比赛----骰子求和
- Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性
- 计算球面两点间距离实现Vincenty+Haversine
- HDFS原理解析
- Gensim入门教程