BigDecimal使用整理

一、    
BigDecimal简介

计算机计算中无论是float还是double都是浮点数,由于计算机是二进制的,导致在在浮点数计算时会出现精度丢失,因此引入BigDecimal(java.math.BigDecimal)。

Java在java.math包中提供的 API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用 java.math.BigDecimal(BigDecimal)所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用BigDecimal相对应的方法。方法中的参数也必须是BigDecimal的对象。

二、     BigDecimal构造方法

Bigdecimal构造时,不要直接使浮点数作为构造方法的参数,这样会出现精度丢失的问题。

Bigdecimal构造时使用BigDecimal.valueOf()方法,或者使用字符串作为BigDecimal构造方法的参数,避免精度丢失的问题。

例如:

  BigDecimal b1 = new
BigDecimal("1.23");//1.23

  BigDecimal b2 =
BigDecimal.valueOf(1.23);//1.23

  BigDecimal b3 = new
BigDecimal(String.valueof(1.23));//1.23

精度丢失例如:

BigDecimal one1 = new BigDecimal(1.23); // 则结果会出现精度问题, 相应值会变成1.229999999999999982236431605997495353221893310546875
 

另外除了这两种外,特殊的像0、1、10可以这样写。

1. 
BigDecimal zero =
BigDecimal.ZERO;

2. 
BigDecimal one  =
BigDecimal.ONE;

3. 
BigDecimal ten  =
BigDecimal.TEN;

三、      BigDecimal的加减乘除运算
  public BigDecimal add(BigDecimal value); // 加法
  public BigDecimal subtract(BigDecimal value); // 减法 
  public BigDecimal multiply(BigDecimal value); // 乘法
  public BigDecimal divide(BigDecimal value); // 除法
 
BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象。
 
四、      BigDecimal的比较方法(compareTo和equals对比)

BigDecimal在数字上小于、等于或大于被比较对象时,返回 -1、0或 1。

例如:

BigDecimal one = BigDecimal.valueOf(1);

BigDecimal two = new BigDecimal("2");

BigDecimal three = one.add(two);

int i1 = one.compareTo(two);     // -1

int i2 = two.compareTo(two);     // 0

int i3 = three.compareTo(two);   // 1

注意值相等但具有不同精度的两个BigDecimal对象(如,1.0 和 1.00)被认为是相等的。

注意BigDecimal的比较运算最好不要用equals实现,因为BigDecimal的equals方法在比较的时候要比较两个数值的精度。

// 精度不同,数值不相等

BigDecimal decimal1 = BigDecimal.valueOf(0);

BigDecimal decimal2 = new BigDecimal("0.00");

System.out.println("the result is
" +decimal1.equals(decimal2)); // false

// 设置为相同精度后再次比较

BigDecimal decimal3 = BigDecimal.valueOf(0).setScale(2);

BigDecimal decimal4 = new BigDecimal("0.00").setScale(2);

System.out.println("the result is
" +decimal3.equals(decimal4)); // true

使用BigDecimal类equals方法判断两个BigDecimal类型的数据时,需要设置精度,否则结果可能不正确

 
 

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

BigDecimal使用整理的更多相关文章

  1. BigDecimal相关整理

    bigdecimal类型四则运算: BigDecimal s = new Bigdecimal(5); BigDecimal x = new Bigdecimal(15); 依次为最基础的加减乘除: ...

  2. [转]BigDecimal使用(整理)

    原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算.比如:货币 使用 ...

  3. B/S系统常见缺陷整理和解决方案

    最近部门整理了今年所有项目测试团队提出的BUG,筛选了几十个作为常规通用的缺陷,我根据这些缺陷内容,去掉和业务相关的知识,整理出了一份缺陷描述和解决方案. 其实WEB系统中常规的缺陷分类后也就那么多, ...

  4. Sonar 常用代码规则整理(二)

    摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ============ ...

  5. Java基础语法<五> 大数值BigInteger BigDecimal

    笔记整理 来源于<Java核心技术卷 I > <Java编程思想> 如果基本的整数和浮点数精度不能够满足需求,那么可以使用java.math包中的两个很有平有用的类:BigIn ...

  6. Java的精确整数计算-Bigdecimal学习总结和工具类

    随笔:随着最近工作需要,回首需要涉及到一些精确的数据计算,就需要用到Bigdecimal,索性就趁着闲暇之余整理收集一下关于Bigdecimal的使用方法,由于时间的原因,整理的并不是特别详细,但相信 ...

  7. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  8. 单元测试系列之十:Sonar 常用代码规则整理(二)

    摘要:帮助公司部署了一套sonar平台,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分析,避免再次出现类似问题. 作者原创技术文章,转载请注明出处 ======== ...

  9. Java多线程面试题整理

    部分一:多线程部分: 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. ...

随机推荐

  1. STM32 通用T2、T3、T4、T5定时器详解

    定时器初始化配置 void TIM3_Configuration(void)//1MS { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeI ...

  2. cassandra的primary key, partition key, cluster key,

    https://stackoverflow.com/questions/24949676/difference-between-partition-key-composite-key-and-clus ...

  3. CentOS7下利用init.d启动脚本实现tomcat开机自启动

    在之前的博文中已经对CentOS7下通过tomcat进行WEB系统的发布进行了介绍,今天将利用init.d启动脚本,将服务脚本加入到开机启动服务队列,实现tomcat服务的开机启动. 1. 环境准备 ...

  4. Visual Studio - 创建和使用动态库

    一.VS2013 创建动态库 1.1 新建项目 1.2.在Win32应用程序向导对话框上勾选“DLL”和“空项目”复选框,点完成 1.3 .添加对应的.C文件和.h文件 1.4 在.h文件中添加如下代 ...

  5. UML类图详解_关联关系_一对多

    对于一对多的示例,可以想象一个账户可以多次申购.在申购的时候没有固定上限,下限为0,那么就可以使用容器类(container class)来搞,最常见的就是vector了. 下面我们来看一个“一对多” ...

  6. Hibernate使用注意事项

    映射的POJO类型中如果有基本类型最好都是用包装类来代替: 注意关联关系的正确设置,一对一(主键方式.外键外键方式),一对多和多对多的配置,单向.双向的配置: 更新核心配置文件的mapping:如果是 ...

  7. file、inode在应用层和驱动层之间的联系_转

    转自:http://blog.csdn.net/dreaming_my_dreams/article/details/8272586 应用层和驱动的衔接,一直是一个老大难问题,若弄不清楚,总觉得驱动写 ...

  8. Eureka 2.0 闭源--选择Consul???

    在上个月我们知道 Eureka 2.0 闭源了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件,Eureka ...

  9. Linux 进程创建一(system和fork)

    一:system系统调用 #include <stdlib.h> int system(const char *string); system函数传递给/bin/sh -c 来执行stri ...

  10. AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 最大的 ...