全面的BigDecimal详解

                                           BigDecimal详解

 

       在平时学习中,大家很少接触到BigDecimal,有些朋友还是第一次接触到这个类,那么就先谈谈BigDecimal是什么,并且BigDecimal用处是什么,在什么场合使用,BigDecimal如何去使用。

1 初识BigDecimal

 

1.1 BigDecimal使用背景

       在java运算某些数字时,会出现在千万甚至亿万的小数位上出错,这些都是在浮点运算的时候才会出现的一些小误差的结果。也就是精度缺失。双精度浮点型变量double可以处理16位有效数。

      在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。尤其是有关金融行业的开发,有关数字的计算都不会去使用float和double。在金钱方面这个就尤为重要,试想开发使用float或者double类型导致精度缺失,之后在此数上*10000000000000,这时会发现自己钱少了?或者多了?这个是客户所不愿看见的。基于此种情况就需要使用java.math.BigDecimal。

1.2 BigDecimal用处

       Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。BigDecimal的使用可以解决浮点运算精度丢失的问题。

首先稍微理解下为什么会精度丢失:

       原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。

       博主这里推荐一篇文章可以帮助理解精度缺失问题:https://blog.csdn.net/aosica321/article/details/53536928

那为什么BigDecimal可以解决精度丢失的问题呢?

      BigDecimal所创建的是对象,大家也知道我们所创建的基本数据类型和引用数据类型在内存中存储是不一样的,基本数据类型存储在栈中,引用数据类型存储在堆中。

      在堆中存储是不能直接进行操作,因此BigDecimal不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

2 BigDecimal的使用

 

2.1 构建BigDecimal

BigDecimal一共有4个构造方法:

BigDecimal(int) 创建一个具有参数所指定整数值的对象。

BigDecimal(double) 创建一个具有参数所指定双精度值的对象。(不建议采用)

BigDecimal(long) 创建一个具有参数所指定长整数值的对象。

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象

为什么不建议采用第二种构造方法?如下代码:

   public static void main(String[] args) {
        	BigDecimal bigDecimal = new BigDecimal(2);
        	BigDecimal bDouble = new BigDecimal(2.3);
        	BigDecimal bString = new BigDecimal("3.2");
        	System.out.println("bigDecimal:"+bigDecimal);
        	System.out.println("bDouble:"+bDouble);
        	System.out.println("bString:"+bString);
         }

运行结果:

bigDecimal:2
bDouble:2.29999999999999982236431605997495353221893310546875
bString:3.2

      原因:JDK的描述:1、参数类型为double的

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值