[转]Java中BigDecimal的使用
原文地址:https://blog.csdn.net/cen_s/article/details/76472834
在日常开发中我们经常会碰到小数计算,而小数直接计算的话会出现一些小小的错误,如下
System.out.println(1.01 + 2.02);
你说能输出什么?3.03?实际上输出的是3.0300000000000002。这是因为不论是float 还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度。有没有不失精度的办法呢?这里就要用到BigDecimal了。
java.math.BigDecimal。Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
创建BigDecimal对象主要有两种。
- BigDecimal b1 = new BigDecimal("1.34");//1.34
- BigDecimal b2 = BigDecimal.valueOf(1.34);//1.34
其中b1也可以写成new BigDecimal(Double.toString(1.34)),可以直接new BigDecimal(1.34)吗,也是可以的,只是会出现上述的精度问题。
- BigDecimal one1 = new BigDecimal(1.34);//1.3400000000000000799360577730112709105014801025390625
- BigDecimal two1 = new BigDecimal("1.34");//1.34
除了这两种外,特殊的像0、1、10可以这样写。
- BigDecimal zero = BigDecimal.ZERO;
- BigDecimal one = BigDecimal.ONE;
- BigDecimal ten = BigDecimal.TEN;
比较一下BigDecimal.ZERO、new BigDecimal("0")、BigDecimal.valueOf(0)这三者,equals都是true,==的话new BigDecimal("0")就不用看了都new了,而BigDecimal.ZERO
== BigDecimal.ZERO为true。查看一下源代码可得。
- public static BigDecimal valueOf(long val) {
- if (val >= 0 && val < zeroThroughTen.length)
- return zeroThroughTen[(int)val];
- else if (val != INFLATED)
- return new BigDecimal(null, val, 0, 0);
- return new BigDecimal(INFLATED_BIGINT, val, 0, 0);
- }
- // Cache of common small BigDecimal values.
- private static final BigDecimal zeroThroughTen[] = {
- new BigDecimal(BigInteger.ZERO, 0, 0, 1),
- new BigDecimal(BigInteger.ONE, 1, 0, 1),
- new BigDecimal(BigInteger.valueOf(2), 2, 0, 1),
- new BigDecimal(BigInteger.valueOf(3), 3, 0, 1),
- new BigDecimal(BigInteger.valueOf(4), 4, 0, 1),
- new BigDecimal(BigInteger.valueOf(5), 5, 0, 1),
- new BigDecimal(BigInteger.valueOf(6), 6, 0, 1),
- new BigDecimal(BigInteger.valueOf(7), 7, 0, 1),
- new BigDecimal(BigInteger.valueOf(8), 8, 0, 1),
- new BigDecimal(BigInteger.valueOf(9), 9, 0, 1),
- new BigDecimal(BigInteger.TEN, 10, 0, 2),
- };
发现10以内的对象都是同一个,所以为true。
BigDecimal的加减乘除运算。
- public BigDecimal add(BigDecimal value);//加法
- public BigDecimal subtract(BigDecimal value);//减法
- public BigDecimal multiply(BigDecimal value);//乘法
- public BigDecimal divide(BigDecimal value);//除法
也可以照下面加法例子写成一个util,另外三个都差不多就不展开了。
- public static double add(double value1,double value2){
- BigDecimal b1 = new BigDecimal(Double.toString(value1));
- BigDecimal b2 = new BigDecimal(Double.toString(value2));
- return b1.add(b2).doubleValue();
- }
BigDecimal的运算都没有对原值进行操作,而是返回一个新的BigDecimal对象,这点可能有些小伙伴会搞错要注意一下。
- BigDecimal b1 =new BigDecimal("1.34");
- System.out.println("b1: " + b1);
- BigDecimal b2 =new BigDecimal("2.34");
- b1.add(b2);
- System.out.println("b1: " + b1);//b1并没有变
BigDecimal的比较用的是BigDecimal的compareTo方法,将此 BigDecimal 与指定的 BigDecimal 比较。
根据此方法,值相等但具有不同标度的两个BigDecimal对象(如,2.0 和 2.00)被认为是相等的。
当此 BigDecimal 在数字上小于、等于或大于被比较对象时,返回 -1、0 或 1。
- BigDecimal one = BigDecimal.valueOf(1);
- BigDecimal two = BigDecimal.valueOf(2);
- BigDecimal three = one.add(two);
- int i1 = one.compareTo(two);//-1
- int i2 = two.compareTo(two);//0
- int i3 = three.compareTo(two);//1
[转]Java中BigDecimal的使用的更多相关文章
- Java中BigDecimal的8种舍入模式是怎样的
Java中BigDecimal的8种舍入模式是怎样的?下面长沙欧柏泰克软件学院和大家一起来学习下吧: java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecima ...
- 关于java中BigDecimal的简介
关于java中BigDecimal的简介 1.BigDecimal属于大数据,精度极高,不属于基本数据类型,属于java对象(引用数据类型), 这是sun提供的一个类,专门用在财务软件中. 2.注意: ...
- java中BigDecimal加减乘除基本用法
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进 ...
- Java中BigDecimal的8种舍入模式
java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成. 如果为零或正数,则标度是小数点后的位 ...
- Java中BigDecimal的舍入模式
java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成. 如果为零或正数,则标度是小数点后的位 ...
- Java中BigDecimal类介绍及用法
Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算. 其中 BigInteger 类是 ...
- java中BigDecimal在金融行业中的使用
1.引言 在java语言中,double和float用于二进制浮点型计算,无法得到精确的结果.而BigDecimal则用于精确的计算.不超过16位有效数字(最好是不超过13位)的科学和工程计算,可以使 ...
- java中BigDecimal的学习
干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习. 最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉 ...
- Java基础扫盲系列(二)—— Java中BigDecimal和浮点类型
一直以来我几乎未使用过BigDecimal类型,只有在DB中涉及到金额字段时听说要用Decimal类型,但是今天再项目代码中看到使用BigDecimal表示贷款金额. 本篇文章不是介绍BigDecim ...
随机推荐
- Xcode command line tools
1.Xcode command line tools 安装 如果你不是一名 iOS 或 OS X 开发者,可以跳过安装 XCode 的过程,直接安装 Xcode command line tools. ...
- objgraph无法生成分析图的原因
x = [1, 2, 3]y = [x, dict(key1=x)]z = [y, (x, y)] import objgraphobjgraph.show_refs([y],filename='sa ...
- mmap映射文件至内存( 实现 共享内存 与 文件的另类访问 )
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: < ...
- Android_Bitmap_图片的二次采样并生成缩略图
1.Bitmap概述 Android系统支持几种图片(.png (preferred), .jpg (acceptable), .gif (discouraged)), 其中Bitmap位图#ffff ...
- postman 定义并使用全局变量
第一步:找到并打开右上角的设置图案 第二步,点击“Global” 按钮 第三步.如图所示,定义全局变量,然后点击“save”即可 第四步:如何使用全局变量,只需要 {{ key }} 即可,如图所示 ...
- fiddler 抓取iphone发出的http和https包
1.清理iphone的描述文件,在通用里面设置.这一步目的防止手机里面已经存在了DO_NOT_TRUST_FiddlerRoot证书,导致后面抓不了包,所以先清理下 2.下载安装fiddler,百度或 ...
- 更新中国地区ip列表
鉴于高总的IPIP.net的数据库的准确性,推荐使用下列源: https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt ...
- 硬盘内部硬件结构和工作原理详解[zz]
一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标.型号.序列号.生产日期.容量.参数和主从设置方法等.这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义. 硬盘主要由盘体.控制电路 ...
- Linq to sql 消除列重复 去重复
按user分组,取每组的第一个: var o = from r in xe.Descendants("customer") group r b ...
- java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException 的解决办法之一
在查看别人的代码的时候,遇到了把工程导入到 Android Studio ,报:ExecutionException: com.android.ide.common.process.ProcessEx ...