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. cocos2d-x 3.0rc2版公布了

    本人博客地址,转载吧亲们:http://blog.csdn.net/dawn_moon 之前做小鸟的和跑酷的时候尽管cocos2d-x出了3.0版,可是还是alpha版.当时大致看了一下发现有蛮多修改 ...

  2. android-异步消息处理机制初步

    Android的异步消息处理主要由4个部分组成,Message.Handler.MessageQueue和Looper Message:在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程 ...

  3. hystrix-turbine实现多服务监控

    原文地址:http://www.cnblogs.com/skyblog/p/5633757.html 1.   概述 Demo地址:http://git.oschina.net/zhou666/spr ...

  4. 深入PHP中慎用双等于(==)的详解

    PHP比较运算符出现的频率实在是太高了,尤其是 ==if(a == b){// do something}但是,你真的掌握了 == 了吗?细节很重要!来看下面的代码,说出你认为正确的答案var_dum ...

  5. Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc

    Atitit. visual studio vs2003 vs2005 vs2008  VS2010 vs2012 vs2015新特性 新功能.doc 1.1. Visual Studio2 1.2. ...

  6. Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持

    Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致  推荐1 2. Apache 反向代理 推荐1 ...

  7. 分享我们必须知道的高速GTX技术

    eSATA接口只有几根线为什么那么快?连上网线显示的1Gbps是不是很令人兴奋!没错他们都用了高速GTX技术,GTX全称为Gigabit Transceiver,是为了满足现代数字处理技术和计算技术庞 ...

  8. Linux 脚本点滴知识积累

    1.以openwrt中的/etc/hotplug.d/button/00-button为例 . /lib/functions.sh do_button () { local button   ---- ...

  9. CI框架基本配置/教你学习CI框架codelgniter

    CI框架现在中国可以说还是不成熟,不像thinkphp那样有那么多的中文手册,在国内,很多国人英语都很烂,CI现在教程还是不多.大家心里都存在这严重想法 CI 框架现在中国可以说还是不成熟,不像thi ...

  10. ImageData

    http://www.html5china.com/HTML5features/canvas/20120501_3591.html 1.上下文对象 Context 有三个方法用来创建.读取和设置 Im ...