Java中的大数处理类BigInteger和BigDecimar浅析
这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal;
BigInteger和BigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数)。主要用于高精度计算中。这两个类使得java中的大数,高精度运算变得很简单。
下面从几个方面对BigInteger和BigDecima做一个简单的比较:
一.常量
BigInteger:ONE,ZERO,TEN分别代表1,0,10.
其定义类似于:public static final BigInteger ONE = valueOf(1);
BigDecimal:除了以上三个常量外还有8个关于舍入的常量,这里不再赘述,可以去查看API的帮助手册.
顺便说一句,BigDecimal由于舍入模式的存在,使得这个类用起来比BigInteger要复杂.这里不再赘述,具体可以查看API的帮助手册,但是平时对起复杂特性用的不多,所以用的时候查阅API也是可行的.
二.声明赋值
BigInteger:BigInteger bi = new BigInteger("100");或:BigInteger bi = BigInteger.valueOf(100);
数组定义与基本类型类似.
BigDecimal:BigDecimal bd = new BigDecimal(100);或:BigDecimal bd = BigDecimal.valueOf(100);
BigDecimal的构造函数比BigInteger多一些,感觉用起来更方便些,比如这样定义就是错误的:BigInteger bi = new BigInteger(100);
顺便说一下,java.util包中的Scanner类实现了nextBigInteger()和nextBigDecimal()方法,可以用来读入控制台输入的BigInteger和BigDecimal.给个例子:
- Scanner sc = new Scanner(System.in);
- while(sc.hasNext()){
- BigInteger bi;
- //BigDecimal bd;
- bi = sc.nextBigInteger();//读入BigInteger
- // bd = sc.nextBigDecimal();//读入BigDecimal
- System.out.println(bi.toString());
- //System.out.println(bd.toString());
- }
三.相关函数
主要介绍一下四则运算等函数:
用两个例子来说明比较直观一些:
BigInteger:
- package Factorial;
- import java.math.BigInteger;
- import java.util.Random;
- /**
- * 测试BigInteger类的一些函数
- * @author LY 2011-10-27
- * */
- public class BigIntegerDemo {
- public static void main(String[] arguments){
- System.out.println("构造两个BigInteger对象: ");
- //BigInteger(int numBits, Random rnd)
- //构造一个随机生成的 BigInteger,它是在 0 到 (2^numBits - 1)(包括)范围内均匀分布的值
- BigInteger bi1 = new BigInteger(55,new Random());
- System.out.println("bi1 = " + bi1);
- //BigInteger(byte[] val)
- //将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。
- BigInteger bi2 = new BigInteger(new byte[]{3,2,3});
- System.out.println("bi2 = " + bi2);
- //加
- System.out.println("bi1 + bi2 = " + bi1.add(bi2));
- //减
- System.out.println("bi1 - bi2 = " + bi1.subtract(bi2));
- //乘
- System.out.println("bi1 * bi2 = " + bi1.multiply(bi2));
- //指数运算
- System.out.println("bi1的2次方 = " + bi1.pow(2));
- //整数商
- System.out.println("bi1/bi2的整数商: " + bi1.divide(bi2));
- //余数
- System.out.println("bi1/bi2的余数: " + bi1.remainder(bi2));
- //整数商+余数
- System.out.println("bi1 / bi2 = " + bi1.divideAndRemainder(bi2)[0] +
- "--" + bi1.divideAndRemainder(bi2)[1]);
- System.out.println("bi1 + bi2 = " + bi1.add(bi2));
- //比较大小,也可以用max()和min()
- if(bi1.compareTo(bi2) > 0)
- System.out.println("bd1 is greater than bd2");
- else if(bi1.compareTo(bi2) == 0)
- System.out.println("bd1 is equal to bd2");
- else if(bi1.compareTo(bi2) < 0)
- System.out.println("bd1 is lower than bd2");
- //返回相反数
- BigInteger bi3 = bi1.negate();
- System.out.println("bi1的相反数: " + bi3);
- //返回绝对值
- System.out.println("bi1的绝对值: " + bi3.abs());
- }
- }
运行结果:
- 构造两个BigInteger对象:
- bi1 = 8893838204110884
- bi2 = 197123
- bi1 + bi2 = 8893838204308007
- bi1 - bi2 = 8893838203913761
- bi1 * bi2 = 1753180068308949786732
- bi1的2次方 = 79100358000902314326836967261456
- bi1/bi2的整数商: 45118216565
- bi1/bi2的余数: 168389
- bi1 / bi2 = 45118216565--168389
- bi1 + bi2 = 8893838204308007
- bd1 is greater than bd2
- bi1的相反数: -8893838204110884
- bi1的绝对值: 8893838204110884
BigDecimal:
- package Factorial;
- import java.math.BigDecimal;;
- /**
- * 测试BigDecimal类的一些函数
- * @author LY 2011-10-27
- * */
- public class BigDecimalDemo {
- public static void main(String[] arguments){
- System.out.println("构造两个BigDecimal对象: ");
- //用char[]数组创建BigDecimal对象,第二个参数为位移offset,
- //第三个参数指定长度
- BigDecimal bd1 = new BigDecimal("3464656776868432998434".toCharArray(),2,15);
- System.out.println("bd1 = " + bd1);
- //用double类型创建BigDecimal对象
- BigDecimal bd2 = new BigDecimal(134258767575867.0F);
- System.out.println("bd2 = " + bd2);
- //加
- System.out.println("bd1 + bd2 = " + bd1.add(bd2));
- //减
- System.out.println("bd1 - bd2 = " + bd1.subtract(bd2));
- //乘
- System.out.println("bd1 * bd2 = " + bd1.multiply(bd2));
- //指数运算
- System.out.println("bd1的2次方 = " + bd1.pow(2));
- //取商的整数部分
- System.out.println("bd1/bd2的整数商: " + bd1.divideToIntegralValue(bd2));
- //返回余数计算为:this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))
- //System.out.println(bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2)));
- System.out.println("bd1/bd2的余数: " + bd1.remainder(bd2));
- //取商和余,即bd1.divideToIntegralValue(bd2)与bd1.remainder(bd2)
- System.out.println("bd1 / bd2 = " + bd1.divideAndRemainder(bd2)[0] +
- "--" + bd1.divideAndRemainder(bd2)[1]);
- //比较大小,也可以用max()和min()
- if(bd1.compareTo(bd2) > 0)
- System.out.println("bd1 is greater than bd2");
- else if(bd1.compareTo(bd2) == 0)
- System.out.println("bd1 is equal to bd2");
- else if(bd1.compareTo(bd2) < 0)
- System.out.println("bd1 is lower than bd2");
- //末位数据精度
- System.out.println("bd1的末位数据精度: " + bd1.ulp());
- }
- }
运行结果:
- 构造两个BigDecimal对象:
- bd1 = 646567768684329
- bd2 = 134258765070336
- bd1 + bd2 = 780826533754665
- bd1 - bd2 = 512309003613993
- bd1 * bd2 = 86807390157840676971865964544
- bd1的2次方 = 418049879501431972683650180241
- bd1/bd2的整数商: 4
- bd1/bd2的余数: 109532708402985
- bd1 / bd2 = 4--109532708402985
- bd1 is greater than bd2
- bd1的末位数据精度: 1
本文对BigInteger和BigDecimal类进行了比较浅显的介绍及比较,如对这两个类有兴趣,可以查阅API或研读其源码.
原文:http://ly5633.iteye.com/blog/1218724
Java中的大数处理类BigInteger和BigDecimar浅析的更多相关文章
- JAVA中封装JSONUtils工具类及使用
在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...
- Java中直接输出一个类的对象
例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...
- Java中Date和Calender类的使用方法
查看文章 Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...
- Java中的不可变类理解
一.Java中的不可变类 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量. 可变类(Mutable Objects):类的实例创建后,可以修 ...
- Java 中的静态嵌套类和非静态嵌套类
Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { p ...
- Java中如何查看一个类依赖的包
Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包? 测试语句: public static void main(Strin ...
- 问题009:java当中的关键字有哪些?在Editplus文本编辑软件中是什么颜色的?java当中的标识符有什么要求?Java中注释分为几类?
(1) public 公共的,表示访问的权限 (2) private 私有的,表示一种访问权限 (3) class 类关键字,表示定义一个类 java中的关键字都是大写的还是小写的?小写的,在Edit ...
- Java 中常见的 final 类
Java 中常见的 final 类 java.lang 包 public final class Boolean extends Object implements Serializable, Com ...
- Java 中的并发工具类
Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...
随机推荐
- node-webkit 应用打包发布
方便进行打包,使用了nodejs ,gulp nw-builder 备注 windows 操作系统部分版本需要包含 msvcr100.dll 建议制作安装程序的时候直接包含 为了进行视频以及 ...
- spring mvc 利用匿名内部类构建返回json对象
@RequestMapping(value = "/order/findOrderByIdVague/{noId}.json", method = {RequestMethod.G ...
- 【性能诊断】十一、性能问题综合分析(案例2,windbg、wireshark)
[问题描述]: 前段时间有一项目反馈,常用的审批功能有时的响应较慢,多个管理员功能不定期的出现客户端无响应的状况,并且管理员功能一旦出现卡死,也会影响到普通的业务用户致使很多用户无法操作. ...
- 如何进行oracle capability i/o(压力测试数据库服务器i/o性能)
一 .oracle 有关 IO 信息的相关统计函数 Oracle i/o stack包含hbas,存储相关的交换机.存储物理磁盘.那么oracle建议在应用程序部署的时候,建议去验证i/o避免存在问题 ...
- [算法] 数据结构之AVL树
1 .基本概念 AVL树的复杂程度真是比二叉搜索树高了整整一个数量级——它的原理并不难弄懂,但要把它用代码实现出来还真的有点费脑筋.下面我们来看看: 1.1 AVL树是什么? AVL树本质上还是一棵 ...
- 剑指offer系列52---约瑟夫环问题
[题目]0,1,...n排成一个圈,从0开始每次删除第m个数,求圆圈最后个数. * [思路]1 用数组模拟圆圈.当数到最后一个数即index==n时,令index==0 重头开始遍历: * 当遇到已经 ...
- 【sql】之使用sql根据身份证查询过生日人数
根据当前日期查询有多少人过生日 ,) = DATE_FORMAT(NOW(),'%m'); 查询price一样的人数 select * from people where price in (sele ...
- sql server 2012 如何收缩事务日志
sql2008不再支持 BACKUP LOG 数据库名 WITH NO_LOG 语句 BACKUP Log zxta with no_log 截断事务日志 sql2008 提示错误如下 BACKU ...
- TSP(旅行者问题)——动态规划详解(转)
1.问题定义 TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短. 假设现在有四个城市,0,1,2,3,他们之间的代价如图一,可以存成 ...
- PLSQL_数据泵导入进度查看Impdp/Expdp Status(案例)
20150701 Created By BaoXinjian