`
ly5633
  • 浏览: 80671 次
社区版块
存档分类
最新评论

Java中的大数处理类BigInteger和BigDecimar浅析

阅读更多

 

这两个类位于java.math包内,要使用它们必须在类前面引用该包:import java.math.BigInteger;和import java.math.BigDecimal;

BigIntegerBigDecimal分别表示不可变的任意精度的整数和不可变的有符号的任意精度的十进制数(浮点数)。主要用于高精度计算中。这两个类使得java中的大数,高精度运算变得很简单。

下面从几个方面对BigIntegerBigDecima做一个简单的比较:

 

一.常量

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或研读其源码.

3
1
分享到:
评论
1 楼 memoryisking 2015-01-11  
文章写的不错,但是感觉BigInteger还是有很多内容没有写出来,从网上看到这篇文章写的很详细:http://swiftlet.net/archives/tag/java-biginteger,这个BigInteger系列内容分析的比较透彻。

相关推荐

    java练习_大数运算_BigInteger.pdf

    正如我们在 Java 中处理大数运算时,需要使用 BigInteger 类来实现,这是因为 Java 的基本数据类型无法存储非常大的数字。BigInteger 类提供了几个重要的方法来进行大数运算,包括加、减、乘、除和取余等。 在了解 ...

    java练习_大数运算_BigInteger[参考].pdf

    BigInteger类是Java中用于处理大整数的类,它提供了多种方法来处理大整数。BigInteger类的使用非常广泛,特别是在金融、科学计算、密码学等领域。 BigInteger类的方法调用: 1. 加法操作:使用add()方法可以进行...

    Java 实现大数类

    在Java中,虽然有内置的`java.math.BigInteger`类可以方便地处理大数运算,但为了学习和理解大数操作的原理,我们可以自行实现一个大数类。这个项目的目标就是创建一个自定义的大数类,实现基本的大数加法和减法功能...

    java 大数类 计算器 文件比较

    在Java中,可以使用`java.io`包中的`File`类和`java.nio.file`包中的`Files`类进行文件的比较。基本的方法是读取两个文件的内容,然后逐行或者逐字节比较。如果内容完全相同,则认为文件是相同的。更复杂的方法可能...

    使用java大数做ACM大数题的常用介绍

    总之,`BigInteger`类是Java处理大数问题的强大工具,通过熟练掌握它的使用,我们可以解决ACM竞赛中遇到的大部分大数题目。同时,结合良好的算法设计和优化技巧,可以在有限的时间内给出正确的解决方案。

    JAVA大数加法与乘法

    `BigInteger`是Java中用于表示任意精度整数的类。它支持任意大小的整数,可以进行加法、减法、乘法、除法以及更多复杂的数学运算。`BigInteger`对象不存储在固定长度的二进制补码表示中,而是使用一种动态增长的数据...

    java:大数运算的BigInteger类型(整数类)的一些运算

    大数运算的BigInteger类型(整数类)的一些运算关键词相关说明源码运行结果 关键词 import java.math.BigInteger; BigInteger big_number_0=new BigInteger(“A”); A为大数的值,可以是Integer类范围内或外的数。 ...

    JAVA_大数操作

    通过学习和掌握`BigInteger`类,开发者可以处理Java标准整数类型无法胜任的计算任务。 总结来说,`JAVA_大数操作`主要涉及`BigInteger`类的使用,包括但不限于基本的算术运算、模运算、字符串与二进制转换、比较...

    RSA.rar_BigInteger_RSA BigInteger_RSA java biginteger_RSA 类 java

    在Java中,我们可以使用`java.math.BigInteger`类来处理大整数,这在实现RSA算法时非常关键,因为加密过程中涉及的数字通常超过了普通整型变量的范围。以下是关于`BigInteger`类以及如何在Java中实现RSA加解密的详细...

    java 处理大数模板

    这个模板将详细介绍如何在Java中使用`BigInteger`来解决大数问题。 `BigInteger`是Java的标准库`java.math`包中的一个类,专门用于处理任意精度的整数。它可以表示任何大小的数字,不受32位或64位计算机硬件限制。...

    java处理大数

    本文将重点介绍如何利用`BigInteger`类处理大数,并通过一个具体的示例程序进行深入分析。 #### 二、`BigInteger`类简介 `BigInteger`是`java.math`包下的一个类,专门用于处理任意精度的整数。它可以表示远远超出...

    关于Biginteger的分数类期末课程设计

    在Java编程语言中,BigInteger类是用于处理大整数的一种数据类型,它可以处理超过long类型所能表示的最大值的整数。在"关于Biginteger的分数类期末课程设计"这个项目中,你创建了一个分数类,其中分子和分母都是用...

    Java编写的大数运算

    Java提供了内置的`BigInteger`类和`BigDecimal`类来支持大数运算,这两个类位于`java.math`包下。本项目“Java编写的大数运算”显然就是基于这些类实现了一套自己的大数计算解决方案。 `BigInteger`类是用于表示...

    java大数相加

    这些方法使得`BigInteger`类成为处理大数运算的强大工具。 在实际开发中,可能会遇到更复杂的情况,例如从文件读取大数或者从网络接收大数。这时,可以使用`Scanner`或`BufferedReader`读取数据,然后转换成`...

    Java中BigInteger.docx

    在Java编程语言中,`BigInteger` 类是用来处理大整数的,它支持任意精度的整数运算。这个类是 `java.math` 包的一部分,它提供了比 `int` 和 `long` 更大的范围,可以用来处理超过64位的整数值。在处理大数据量的...

Global site tag (gtag.js) - Google Analytics