一、例子

double a = 10.0;
double b = 3.0;
System.out.println( a / b );

在上面这个例子中,你觉得答案应该是多少? 有的人说这不简单 不就是3.33333....一直循环吗?但是我们看一下运行结果,可能你会大吃一惊:

我们可以看到,计算出来的程序是有误差的。 我们再来看一个例子:

double a = 0.1;
double b = 0.2;
System.out.println( a + b );

我们看到的结果,同样也是不准。

二、实际开发带来的麻烦

假如开发的是金融、电商行业的系统,那么对数据的精确度要求是非常高的。因此Java的基本类型 double、int、float是远远不能够满足计算的精确度的。

三、BigDecimal的常用构造方法

为了满足对计算精确度的要求,Java提供了一个精确计算的类BigDecimal。这个类给我们提供了两个常用的构造方法,分别是:

1、 public BigDecimal(double val)

2、 public BigDecimal(String val)

具体的代码使用如下:

BigDecimal bd1 = new BigDecimal(10.0);
BigDecimal bd2 = new BigDecimal("10.0");
System.out.println(bd1);
System.out.println(bd2);

运行结果如下:

但是,我们推荐你使用第二个构造方法,也就是传入的参数是String类型的构造方法。 为什么呢?请继续往下看!

四、BigDecimal的常用方法

1、加法:public BigDecimal add(BigDecimal augend)

BigDecimal bd1 = new BigDecimal(0.2);
BigDecimal bd2 = new BigDecimal(0.1);
BigDecimal add = bd1.add(bd2);
System.out.println(add);

运行以后,你会发现以下的结果:

这个时候,你会说:骗子!这不还是不精确吗?别急,我们尝试着将构造方法换成String类型参数的构造方法。具体代码如下:

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal add = bd1.add(bd2);
System.out.println(add);

擦亮眼睛,我们来见证一下奇迹:

它终于出来了!!!没错,我们通过BigDecimal类和add方法,就实现了两个小数的精确计算了。接下来我们继续看一下:减法和乘法。

2、减法:public BigDecimal subtract(BigDecimal subtrahend)

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal subtract = bd1.subtract(bd2);
System.out.println(subtract);

运行结果:

3、乘法:public BigDecimal multiply(BigDecimal multiplicand)

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal multiply = bd1.multiply(bd2);
System.out.println(multiply);

运行结果:

五、BigDecimal的除法

除法:public BigDecimal divide(BigDecimal divisor)

1、整除情况:

对于除得尽的情况,大家直接看一下代码就可以一目了然了!

BigDecimal bd1 = new BigDecimal("0.2");
BigDecimal bd2 = new BigDecimal("0.1");
BigDecimal divide = bd1.divide(bd2);
System.out.println(divide);

运行结果:

2、除不尽的情况:

对于除不尽的情况,如果直接使用上面的那一段代码,他会直接报错。

BigDecimal bd1 = new BigDecimal("10.0");
BigDecimal bd2 = new BigDecimal("3.0");
BigDecimal divide = bd1.divide(bd2);
System.out.println(divide);

会报java.lang.ArithmeticException异常

3、除不尽的情况应当使用以下方法:

public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

divisor:被除数

scale:保留几位小数

roundingMode:保留小数采用的策略(

BigDecimal.ROUND_UP:进一法;

BigDecimal.ROUND_FLOOR:去尾法;

BigDecimal.ROUND_HALF_UP:四舍五入法)

这里我们就演示我们熟悉的四舍五入法,如果你感兴趣的话去试试其他两种常用策略:

BigDecimal bd1 = new BigDecimal("10.0");
BigDecimal bd2 = new BigDecimal("3.0");
BigDecimal divide = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP);
System.out.println(divide);

运行结果如下:

以上就是关于BigDecimal类的基本使用,赶紧去试试看吧!

精确计算——BigDecimal的使用相关推荐

  1. Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算,没有数位限制...

    (注:前面写了一个超大整数相加的类,参见: 超大整数相加,超过了long的范围,你要怎么做!,后来有朋友评论说BigDecimal可以完全实现我的这这个功能,刚开始的时候,我还不服气,据我所知那里有这 ...

  2. Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算 没有数位限制

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! (注:前 ...

  3. 【JavaBigDecimal练习】利用BigDecimal精确计算欧拉数

    利用BigDecimal精确计算欧拉数小数点后面1000位 相信大家对于泰勒展开已经稔熟于心,接下来我们就利用下列的泰勒展开: e x = 1 + 1 1 ! x + 1 2 ! x 2 + 1 3 ...

  4. java金额比较大小_JAVA中精确计算金额BigDecimal

    packagecom.chauvet.utils;importjava.math.BigDecimal;importjava.text.DecimalFormat;importjava.text.Nu ...

  5. 180615-精度计算BigDecimal

    文章链接:https://liuyueyi.github.io/hexblog/2018/06/15/180615-精度计算BigDecimal/ 180615-精度计算BigDecimal 目前接触 ...

  6. java 小数精确_Java中小数精确计算

    小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...

  7. java 精确 计算_java中进行高精度精准计算

    今天在做接口传保费的时候出现了一个奇怪的问题,double类型保费变成了一大长串的非精准保费,甚至奇怪,难道是java的bug?最后通过度娘找到了答案 话不多说,先看如下代码public final ...

  8. Java除法不精确引入BigDecimal

    前言: 之前在项目里遇到一个问题:169/100=1.0 int nPtCount = 169; final int MAX_ROUTE_PT = 100; double lfDivide = 0;i ...

  9. 7-2 jmu-Java-02基本语法-05-浮点数的精确计算 (1 分)

    7-2 jmu-Java-02基本语法-05-浮点数的精确计算 (1 分) 输入若干对浮点数,对每对浮点数输出其精确的和与乘积. 以下输入样例为两对浮点数输入,实际上有可能有不定对数的浮点数需要输入计 ...

  10. android int 首位值_Android中数值的精确计算

    Android中数值计算的精度 在平常的开发中,会经常进行数值的计算,而如何才能更加准确的得到计算结果是最重要的,最近在做一个金融类的项目,其中涉及到黄金的计算,所以写这篇文章来总结一下,如何对数值的 ...

最新文章

  1. OpenDigg前端开源项目月报201704
  2. Spring AOP动态代理-切面
  3. linux系统读取第二个盘的数据,磁盘及文件系统管理—第二篇
  4. 算法刷题-数论-试除法求约数、约数个数、约数之和、最大公约数(辗转相除法)
  5. leetcode 刷题 118. 杨辉三角解题思路
  6. ORACLE的基本语法集锦
  7. Moss/Sharepoint 备份或还原时出错的处理(持续更新)
  8. 格式化信息窗口内容—ArcGIS API for JavaScript
  9. 图解大数据 | Hive与HBase详解@海量数据库查询
  10. 【项目管理/PMP/第六版/新考纲】纯干货!项目发展史/项目定义/项目集/项目组合/十五至尊图
  11. 数据库比对升级脚本生成工具分享
  12. 一个完美网站的101项指标.第二部分.内容为王
  13. 百度php获取当前经纬度,百度地图获取经纬度的示例
  14. xbox 360手柄驱动程序_魔派PRO手柄常见问题解决方法一览
  15. 2019CBA选秀大会最终结果
  16. 华为Mate S发布:余承东说要在圣诞季和三星、苹果正面开战---ESM
  17. Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的
  18. Yo(Yeoman)
  19. 2020科目一考试口诀_2021驾考科目一必过口诀
  20. css发光js特效文字动画

热门文章

  1. 35岁老年程序员的绝地翻身之路
  2. C语言----输入人数和姓名,输出最长姓名
  3. PHP解密的方法( 包括GOTO解密_SG11解密_去除源码后门)
  4. php加密=>python解密或者python加密=>php解密
  5. excle批量填充自增数据
  6. 聊一聊为什么JAVA只允许单继承
  7. Gensim的维基百科语料库中文词向量训练错误整理
  8. OP-TEE 编译流程
  9. 20145322何志威《网络对抗》逆向及Bof基础
  10. Flutter中,解决按下返回键将应用挂起到后台,并不会退出的问题