文档章节

使用BigDecimal进行精确运算

SEOwhywhy
 SEOwhywhy
发布于 07/28 10:35
字数 839
阅读 13
收藏 0

  首先我们先来看如下代码示例:
  
  public class Test_1 {
  
  public static void main(String[] args) {
  
  System.out.println(0.06+0.01);
  
  System.out.println(1.0-0.42);
  
  System.out.println(4.015*100);
  
  System.out.println(303.1/1000);
  
  }
  
  }
  
  运行结果如下。
  
  ​ 0.06999999999999999
  
  ​ 0.5800000000000001
  
  ​ 401.49999999999994
  
  ​ 0.30310000000000004
  
  你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。
  
  ​ 其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
  
  ​ 在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
  
  ​ 1、用float或者double变量构建BigDecimal对象。
  
  ​ 2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
  
  ​ 3、把BigDecimal对象转换成float,double,int等类型。
  
  ​ 一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。
  
  BigDecimal b1 = new BigDecimal(Double.toString(0.48));
  
  BigDecimal b2 = BigDecimal.valueOf(0.48);
  
  对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。
  
  public BigDecimal add(BigDecimal value);                        //加法
  
  public BigDecimal subtract(BigDecimal value);                   //减法
  
  public BigDecimal multiply(BigDecimal value);                   //乘法
  
  public BigDecimal divide(BigDecimal value);                     //除法
  
  进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
  
  ​ 下面是一个工具类,该工具类提供加,减,乘,除运算。
  
  public class Arith {
  
  /**
  
  * 提供精确加法计算的add方法
  
  * @param value1 被加数
  
  * @param value2 加数
  
  * @return 两个参数的和
  
  */
  
  public static double add(double value1, double value2){
  
  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  
  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  
  return b1.add(b2).doubleValue();
  
  }
  
  /**
  
  * 提供精确减法运算的sub方法
  
  * @param value1 被减数
  
  * @param value2 减数
  
  * @return 两个参数的差
  
  */
  
  public static double sub(double www.kunlunyule.com value1, double value2){
  
  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  
  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  
  return b1.subtract(b2).doubleValue();
  
  }
  
  /**
  
  * 提供精确乘法运算的mul方法
  
  * @param value1 被乘数
  
  * @param value2 乘数
  
  * @return 两个参数的积
  
  */
  
  public static double mul(double value1, double value2){
  
  BigDecimal b1 = new BigDecimal(www.seocelve.com   Double.valueOf(value1));
  
  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  
  return b1.multiply(b2).doubleValue(www.chengmingdl.com);
  
  }
  
  /**
  
  * 提供精确的除法运算方法div
  
  * @param value1 被除数
  
  * @param value2 除数
  
  * @param scale 精确范围
  
  * @return 两个参数的商
  
  * @throws IllegalAccessException
  
  */
  
  public static double div(double value1, double value2, int scale) throws IllegalAccessException{
  
  //如果精确范围小于0,抛出异常信息
  
  if(scale<0){
  
  throw new IllegalAccessException("精确度不能小于0");
  
  }
  
  BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
  
  BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
  
  return b1.divide(b2, scale).doubleValue();
  
  }
  
  /**
  
  * 舍余
  
  * @param value1 被除数
  
  * @param value2 除数
  
  * @param scale 精确范围
  
  * @return 两个参数的商
  
  * @throws IllegalAccessException
  
  */
  
  public static BigDecimal div2(double value1, double value2, int scale) throws IllegalAccessException{
  
  BigDecimal b1 =www.renheeyuLe.com new BigDecimal(Double.valueOf(value1));
  
  BigDecimal b2 = new BigDecimal(www.renheyL.com Double.valueOf(value2));
  
  return b1.divide(b2, scale, RoundingMode.FLOOR);

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 152
码字总数 335019
作品 0
私信 提问
Double类型的运算精度问题

在Java中简单浮点数类型float和double不能进行运算,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。对于货币精度已知的情况,可以使用整型。 ...

有资本再款
2016/12/03
7
0
Java的Arith(用于做小数的精确计算)类是工具类还是需要自己定义??

//请问下面的类使用是都要自己定义吗 public class Arith { /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 * 确的浮点数运算,包括加减乘除和四舍五入。 */ //默...

单曲循环shield
2015/08/24
1K
1
Java中浮点型数据Float和Double进行精确计算的问题

一、浮点计算中发生精度丢失 大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况。来看下面的...

Junn
2013/06/10
11.8K
1
Java中BigDecimal的加减乘除和比较大小

CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。java的float只能用来进行科学计算或工程计算,在大多数的商业计算中...

Ethel_oo
2017/09/27
31
0
使用BigDecimal进行精确运算

首先我们先来看如下代码示例: public class Test_1 { public static void main(String[] args) { System.out.println(0.06+0.01); System.out.println(1.0-0.42); System.out.println(4.015......

leqianlong
2014/01/22
405
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
今天
5
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部