精确计算——BigDecimal的使用
一、例子
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的使用相关推荐
- Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算,没有数位限制...
(注:前面写了一个超大整数相加的类,参见: 超大整数相加,超过了long的范围,你要怎么做!,后来有朋友评论说BigDecimal可以完全实现我的这这个功能,刚开始的时候,我还不服气,据我所知那里有这 ...
- Java中使用BigDecimal进行浮点数精确计算 超大整数 浮点数等计算 没有数位限制
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! (注:前 ...
- 【JavaBigDecimal练习】利用BigDecimal精确计算欧拉数
利用BigDecimal精确计算欧拉数小数点后面1000位 相信大家对于泰勒展开已经稔熟于心,接下来我们就利用下列的泰勒展开: e x = 1 + 1 1 ! x + 1 2 ! x 2 + 1 3 ...
- java金额比较大小_JAVA中精确计算金额BigDecimal
packagecom.chauvet.utils;importjava.math.BigDecimal;importjava.text.DecimalFormat;importjava.text.Nu ...
- 180615-精度计算BigDecimal
文章链接:https://liuyueyi.github.io/hexblog/2018/06/15/180615-精度计算BigDecimal/ 180615-精度计算BigDecimal 目前接触 ...
- java 小数精确_Java中小数精确计算
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...
- java 精确 计算_java中进行高精度精准计算
今天在做接口传保费的时候出现了一个奇怪的问题,double类型保费变成了一大长串的非精准保费,甚至奇怪,难道是java的bug?最后通过度娘找到了答案 话不多说,先看如下代码public final ...
- Java除法不精确引入BigDecimal
前言: 之前在项目里遇到一个问题:169/100=1.0 int nPtCount = 169; final int MAX_ROUTE_PT = 100; double lfDivide = 0;i ...
- 7-2 jmu-Java-02基本语法-05-浮点数的精确计算 (1 分)
7-2 jmu-Java-02基本语法-05-浮点数的精确计算 (1 分) 输入若干对浮点数,对每对浮点数输出其精确的和与乘积. 以下输入样例为两对浮点数输入,实际上有可能有不定对数的浮点数需要输入计 ...
- android int 首位值_Android中数值的精确计算
Android中数值计算的精度 在平常的开发中,会经常进行数值的计算,而如何才能更加准确的得到计算结果是最重要的,最近在做一个金融类的项目,其中涉及到黄金的计算,所以写这篇文章来总结一下,如何对数值的 ...
最新文章
- OpenDigg前端开源项目月报201704
- Spring AOP动态代理-切面
- linux系统读取第二个盘的数据,磁盘及文件系统管理—第二篇
- 算法刷题-数论-试除法求约数、约数个数、约数之和、最大公约数(辗转相除法)
- leetcode 刷题 118. 杨辉三角解题思路
- ORACLE的基本语法集锦
- Moss/Sharepoint 备份或还原时出错的处理(持续更新)
- 格式化信息窗口内容—ArcGIS API for JavaScript
- 图解大数据 | Hive与HBase详解@海量数据库查询
- 【项目管理/PMP/第六版/新考纲】纯干货!项目发展史/项目定义/项目集/项目组合/十五至尊图
- 数据库比对升级脚本生成工具分享
- 一个完美网站的101项指标.第二部分.内容为王
- 百度php获取当前经纬度,百度地图获取经纬度的示例
- xbox 360手柄驱动程序_魔派PRO手柄常见问题解决方法一览
- 2019CBA选秀大会最终结果
- 华为Mate S发布:余承东说要在圣诞季和三星、苹果正面开战---ESM
- Android图表库MPAndroidChart(二)——线形图的方方面面,看完你会回来感谢我的
- Yo(Yeoman)
- 2020科目一考试口诀_2021驾考科目一必过口诀
- css发光js特效文字动画