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

在金融服务计算中,必须要使用BigDecimal的更多相关文章

  1. 商业计算中Java高精度计算BigDecimal类

    <Effective Java> 第48条:如果需要精确的答案,请避免使用float和double. 如果我们编译运行下面这个程序会看到什么?public class Test{    p ...

  2. 一切的浮点型进行计算操作都要用BigDecimal

    简化: 1.引言 float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的.然而,它们没有提供完全精确 ...

  3. java 金额计算,商业计算 double不精确问题 BigDecimal,Double保留两位小数方法

    解决办法================== http://blog.javaxxz.com/?p=763 一提到Java里面的商业计算,我们都知道不能用float和double,因为他们无法 进行精 ...

  4. FPGA计算中定标与位扩展的实现

    我不知道名字取对没有,在FPGA计算中有时往往需要在不溢出的情况下将数扩大,从而获得更好的计算精度. 比如.在一个8位宽的系统中,将x=0000_0010,算术左移m=5位之后得到xt=0100_00 ...

  5. Hadoop计算中的Shuffle过程(转)

    Hadoop计算中的Shuffle过程 作者:左坚 来源:清华万博 时间:2013-07-02 15:04:44.0 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方.要想理解Ma ...

  6. Java使用极小的内存完成对超大数据的去重计数,用于实时计算中统计UV

    Java使用极小的内存完成对超大数据的去重计数,用于实时计算中统计UV – lxw的大数据田地 http://lxw1234.com/archives/2015/09/516.htm Java使用极小 ...

  7. 算法笔记_031:计算中值和选择问题(Java)

    目录 1 问题描述  2 解决方案 2.1 计算中值问题 2.2 选择问题   1 问题描述 中值问题是求一个n个数列表中某一数组下标k,它要求该下标元素比列表中的一半元素大,又比另一半元素小,这个中 ...

  8. AI芯片:高性能卷积计算中的数据复用

    随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片.卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中 ...

  9. 技术分享预告丨k3s在边缘计算中的应用实践

    技术分享是在[Rancher官方微信技术交流群]里以图文直播+QA实时互动的方式,邀请国内已落地经验的公司或团队负责人分享生产落地的最佳实践.记得添加微信小助手(微信号:rancher2)入群,实时参 ...

随机推荐

  1. Luogu4887 第十四分块(前体)

    sto \(lxl\) orz 考虑莫队,每次移动端点,我们都要询问区间内和当前数字异或有 \(k\) 个 \(1\) 的数字个数 询问 \([l,r]\) 可以再次离线,拆成询问 \([1,l-1] ...

  2. BZOJ1968 [Ahoi2005] 约数研究

    Description Input 只有一行一个整数 N(0 < N < 1000000). Output 只有一行输出,为整数M,即f(1)到f(N)的累加和. Sample Input ...

  3. P1025[SCOI2009]游戏

    windy学会了一种游戏.对于1到N这N个数字,都有唯一且不同的1到N的数字与之对应.最开始windy把数字按 顺序1,2,3,……,N写一排在纸上.然后再在这一排下面写上它们对应的数字.然后又在新的 ...

  4. Heap memory compared to stack memory

  5. APACHE如何一个站点绑定多个域名?

    大家肯定遇到过这样的情况,需要APACHE2里一个站点绑定多个域名,那么如何操作呢?用ServerAlias 以前很笨,要使多个域名指向同一站点总是这样写: ServerAdmin admin@dom ...

  6. linux 下MySQL的安装

    一.安装MySQL   1.下载源码包     从mysql官网上下载linux下的source包mysql-5.0.51b.tar.gz,注意是下载GNU tar格式的,不是rpm包.    2.解 ...

  7. Javascript 中 true 和 false

    "" == false // true "0" == false // true "" == "0" //false 以 ...

  8. Python学习---列表/元组/字典/字符串/set集合/深浅拷贝1207【all】

    1.列表 2.元组 3.字典 4.字符串 5.set集合 6.深浅拷贝

  9. Spring Security 静态资源访问

    在搞 Spring Security 的时候遇到了一个小坑,就是静态资源加载的问题. 当我们继承了 WebSecurityConfigurerAdapter的时候,会去重写几个方法.去设定我们自己要过 ...

  10. 当有多个相同的DIV时,我怎么判断我点击的是哪个嘞

    链接:https://segmentfault.com/a/1190000003480973?utm_source=tuicool&utm_medium=referral 序言 这是我曾经面试 ...