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

最新文章

  1. js闭包Demo
  2. spring 初始化之后执行的方法
  3. java 访问 usb
  4. 转:45 个 LoadRunner 面试问题(附答案)_纯英文,太有逼格了
  5. 简易servlet计算器
  6. 分享一款简洁的jQuery轮播源码
  7. 不需要软件让Windows7变身WIFI热点
  8. mysql编码和Java编码相应一览表
  9. AttributeError: 'module' object has no attribute 'Thread'
  10. 基本功能的shell
  11. angularjs ng-class
  12. Hibernate框架进阶(中篇)之多表关系
  13. Spring读取外部属性-properties
  14. 真正从零开始,TensorFlow详细安装入门图文教程!
  15. ORACLE导入大量数据的两种方式比较
  16. JAVA百度过的异常(1)
  17. Android SDK + Appium 环境搭建
  18. 【centos】 error: command 'gcc' failed with exit status 1
  19. 使用python中的matplotlib 画图,show后关闭窗口,继续运行命令
  20. dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析 (转)

热门文章

  1. localStorage跟cookie的使用
  2. <pre> <textarea> <code>标签区别
  3. Unable to update index for central http://repo1.maven.org/maven2/ 解决方法
  4. 自定义Windows Form无法拖动,简单解决方案。
  5. .NET开源论坛MvcForum推荐
  6. LintCode2016年8月22日算法比赛----骰子求和
  7. Java学习笔记(4)----Public,Protected,Package,Private修饰符可见性
  8. 计算球面两点间距离实现Vincenty+Haversine
  9. HDFS原理解析
  10. Gensim入门教程