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

  • 相关阅读:
    从零开始Windows环境下安装python+tensorflow
    Opencv调用深度学习模型
    python tensorflow 安装
    OpenCV3 Ref SVM : cv::ml::SVM Class Reference
    OpenCV3编程入门笔记(一)
    Tensorflow学习教程变量
    opencv3.0机器学习算法使用
    Tensorflow学习教程Fetch and Feed
    multilayer perceptrons, MLP)模型,CvANN_MLP。
    域的安装配置介绍
  • 原文地址:https://www.cnblogs.com/focus-yun/p/10654036.html
Copyright © 2020-2023  润新知