这两个类位于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.给个例子:

  1. Scanner sc = new Scanner(System.in);
  2. while(sc.hasNext()){
  3. BigInteger bi;
  4. //BigDecimal bd;
  5. bi = sc.nextBigInteger();//读入BigInteger
  6. // bd = sc.nextBigDecimal();//读入BigDecimal
  7. System.out.println(bi.toString());
  8. //System.out.println(bd.toString());
  9. }

三.相关函数

主要介绍一下四则运算等函数:

用两个例子来说明比较直观一些:

BigInteger:

  1. package Factorial;
  2. import java.math.BigInteger;
  3. import java.util.Random;
  4. /**
  5. * 测试BigInteger类的一些函数
  6. * @author LY 2011-10-27
  7. * */
  8. public class BigIntegerDemo {
  9. public static void main(String[] arguments){
  10. System.out.println("构造两个BigInteger对象: ");
  11. //BigInteger(int numBits, Random rnd)
  12. //构造一个随机生成的 BigInteger,它是在 0 到 (2^numBits - 1)(包括)范围内均匀分布的值
  13. BigInteger bi1 =  new BigInteger(55,new Random());
  14. System.out.println("bi1 = " + bi1);
  15. //BigInteger(byte[] val)
  16. //将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。
  17. BigInteger bi2 = new BigInteger(new byte[]{3,2,3});
  18. System.out.println("bi2 = " + bi2);
  19. //加
  20. System.out.println("bi1 + bi2 = " + bi1.add(bi2));
  21. //减
  22. System.out.println("bi1 - bi2 = " + bi1.subtract(bi2));
  23. //乘
  24. System.out.println("bi1 * bi2 = " + bi1.multiply(bi2));
  25. //指数运算
  26. System.out.println("bi1的2次方 = " + bi1.pow(2));
  27. //整数商
  28. System.out.println("bi1/bi2的整数商: " + bi1.divide(bi2));
  29. //余数
  30. System.out.println("bi1/bi2的余数: " + bi1.remainder(bi2));
  31. //整数商+余数
  32. System.out.println("bi1 / bi2 = " + bi1.divideAndRemainder(bi2)[0] +
  33. "--" + bi1.divideAndRemainder(bi2)[1]);
  34. System.out.println("bi1 + bi2 = " + bi1.add(bi2));
  35. //比较大小,也可以用max()和min()
  36. if(bi1.compareTo(bi2) > 0)
  37. System.out.println("bd1 is greater than bd2");
  38. else if(bi1.compareTo(bi2) == 0)
  39. System.out.println("bd1 is equal to bd2");
  40. else if(bi1.compareTo(bi2) < 0)
  41. System.out.println("bd1 is lower than bd2");
  42. //返回相反数
  43. BigInteger bi3 = bi1.negate();
  44. System.out.println("bi1的相反数: " + bi3);
  45. //返回绝对值
  46. System.out.println("bi1的绝对值:  " + bi3.abs());
  47. }
  48. }

运行结果:

  1. 构造两个BigInteger对象:
  2. bi1 = 8893838204110884
  3. bi2 = 197123
  4. bi1 + bi2 = 8893838204308007
  5. bi1 - bi2 = 8893838203913761
  6. bi1 * bi2 = 1753180068308949786732
  7. bi1的2次方 = 79100358000902314326836967261456
  8. bi1/bi2的整数商: 45118216565
  9. bi1/bi2的余数: 168389
  10. bi1 / bi2 = 45118216565--168389
  11. bi1 + bi2 = 8893838204308007
  12. bd1 is greater than bd2
  13. bi1的相反数: -8893838204110884
  14. bi1的绝对值:  8893838204110884

BigDecimal:

  1. package Factorial;
  2. import java.math.BigDecimal;;
  3. /**
  4. * 测试BigDecimal类的一些函数
  5. * @author LY 2011-10-27
  6. * */
  7. public class BigDecimalDemo {
  8. public static void main(String[] arguments){
  9. System.out.println("构造两个BigDecimal对象: ");
  10. //用char[]数组创建BigDecimal对象,第二个参数为位移offset,
  11. //第三个参数指定长度
  12. BigDecimal bd1 = new BigDecimal("3464656776868432998434".toCharArray(),2,15);
  13. System.out.println("bd1 = " + bd1);
  14. //用double类型创建BigDecimal对象
  15. BigDecimal bd2 = new BigDecimal(134258767575867.0F);
  16. System.out.println("bd2 = " + bd2);
  17. //加
  18. System.out.println("bd1 + bd2 = " + bd1.add(bd2));
  19. //减
  20. System.out.println("bd1 - bd2 = " + bd1.subtract(bd2));
  21. //乘
  22. System.out.println("bd1 * bd2 = " + bd1.multiply(bd2));
  23. //指数运算
  24. System.out.println("bd1的2次方 = " + bd1.pow(2));
  25. //取商的整数部分
  26. System.out.println("bd1/bd2的整数商: " + bd1.divideToIntegralValue(bd2));
  27. //返回余数计算为:this.subtract(this.divideToIntegralValue(divisor).multiply(divisor))
  28. //System.out.println(bd1.subtract(bd1.divideToIntegralValue(bd2).multiply(bd2)));
  29. System.out.println("bd1/bd2的余数: " + bd1.remainder(bd2));
  30. //取商和余,即bd1.divideToIntegralValue(bd2)与bd1.remainder(bd2)
  31. System.out.println("bd1 / bd2 = " + bd1.divideAndRemainder(bd2)[0] +
  32. "--" + bd1.divideAndRemainder(bd2)[1]);
  33. //比较大小,也可以用max()和min()
  34. if(bd1.compareTo(bd2) > 0)
  35. System.out.println("bd1 is greater than bd2");
  36. else if(bd1.compareTo(bd2) == 0)
  37. System.out.println("bd1 is equal to bd2");
  38. else if(bd1.compareTo(bd2) < 0)
  39. System.out.println("bd1 is lower than bd2");
  40. //末位数据精度
  41. System.out.println("bd1的末位数据精度:  " + bd1.ulp());
  42. }
  43. }

运行结果:

  1. 构造两个BigDecimal对象:
  2. bd1 = 646567768684329
  3. bd2 = 134258765070336
  4. bd1 + bd2 = 780826533754665
  5. bd1 - bd2 = 512309003613993
  6. bd1 * bd2 = 86807390157840676971865964544
  7. bd1的2次方 = 418049879501431972683650180241
  8. bd1/bd2的整数商: 4
  9. bd1/bd2的余数: 109532708402985
  10. bd1 / bd2 = 4--109532708402985
  11. bd1 is greater than bd2
  12. bd1的末位数据精度:  1

本文对BigInteger和BigDecimal类进行了比较浅显的介绍及比较,如对这两个类有兴趣,可以查阅API或研读其源码.

原文:http://ly5633.iteye.com/blog/1218724

Java中的大数处理类BigInteger和BigDecimar浅析的更多相关文章

  1. JAVA中封装JSONUtils工具类及使用

    在JAVA中用json-lib-2.3-jdk15.jar包中提供了JSONObject和JSONArray基类,用于JSON的序列化和反序列化的操作.但是我们更习惯将其进一步封装,达到更好的重用. ...

  2. Java中直接输出一个类的对象

    例如 package com.atguigu.java.fanshe; public class Person { String name; private int age; public Strin ...

  3. Java中Date和Calender类的使用方法

    查看文章     Java中Date和Calender类的使用方法 2009-10-04 20:49 Date和Calendar是Java类库里提供对时间进行处理的类,由于日期在商业逻辑的应用中占据着 ...

  4. Java中的不可变类理解

    一.Java中的不可变类 不可变类(Immutable Objects):当类的实例一经创建,其内容便不可改变,即无法修改其成员变量. 可变类(Mutable Objects):类的实例创建后,可以修 ...

  5. Java 中的静态嵌套类和非静态嵌套类

    Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { p ...

  6. Java中如何查看一个类依赖的包

    Java中如何查看一个类依赖的包 如图, 我如何知道JSONArray是依赖的哪一个包呢,这里有两个json-lib包?   测试语句:   public static void main(Strin ...

  7. 问题009:java当中的关键字有哪些?在Editplus文本编辑软件中是什么颜色的?java当中的标识符有什么要求?Java中注释分为几类?

    (1) public 公共的,表示访问的权限 (2) private 私有的,表示一种访问权限 (3) class 类关键字,表示定义一个类 java中的关键字都是大写的还是小写的?小写的,在Edit ...

  8. Java 中常见的 final 类

    Java 中常见的 final 类 java.lang 包 public final class Boolean extends Object implements Serializable, Com ...

  9. Java 中的并发工具类

    Java 中的并发工具类 CountDownLatch public class JoinCountDownLatchTest { public static void main(String[] a ...

随机推荐

  1. samba 服务

    samba-client-3.6.9-167.el6_5.i686 samba-3.6.9-167.el6_5.i686 samba-common-3.6.9-167.el6_5.i686 samba ...

  2. Hibernate入门学习(一)

    一.Hibernate是什么 Hibernate主要用来实现Java对象和数据表之间的映射,除此之外还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和JDBC处理数据的时间.Hibe ...

  3. [转][工地][存]Oracle触发器死锁问题解决

    摘自http://blog.itpub.net/12932950/viewspace-607691/ 这两天一直在因为系统初期设计原因导致的一个触发器问题.问题如下:有表T,有客户编号.账户编号及地址 ...

  4. windows mobile仿真器内存调整

    1.打开VS,进入工具,选项. 2.点击设备,在右侧选中要调整的模拟器,点属性. 3.点击仿真器选项. 4.勾选 指定RAM大小. 5.重启仿真管理器.

  5. ASP.NET运行机制原理

    ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...

  6. java 中文 乱码 问号

    在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码, ...

  7. CF 120F Spider 树的直径 简单题

    一个男孩有n只玩具蜘蛛,每只蜘蛛都是一个树的结构,现在男孩准备把这n只小蜘蛛通过粘贴节点接在一起,形成一只大的蜘蛛.大的蜘蛛也依然是树的结构.输出大的蜘蛛的直径. 知识: 树的直径是指树上的最长简单路 ...

  8. php 快速fork出指定个子进程

    $pids = array(); $child_pid = pcntl_fork(); if ($child_pid == -1) { throw new Exception( __METHOD__ ...

  9. python(15)提取字符串中的数字

    python 提取一段字符串中去数字 ss = “123ab45” 方法一:filter filter(str.isdigit, ss) 别处copy的filter的用法: # one>> ...

  10. python(5)字符串处理 (sub,replace,find,index,upper,strip,split,sub翻页

    一,sub和replace的用法 re.sub 函数进行以正则表达式为基础的替换工作 re.sub替换到目标字符串中的a,b或者c,并全部替换 另加上sub翻页操作: re.sub('start=\d ...