java中的BigInteger类和BigDecimal类的应用

8 篇文章 0 订阅

JAVA的两个类BigIntegerBigDecimal分别表示大整数类和大浮点数类,理论上能够表示无限大的数。


BigInteger表示:

package com.xujin;

import java.util.*;
import java.math.*;

public class Test {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		//BigInteger类型的常量
		BigInteger A = BigInteger.ONE;
		System.out.println("BigInteger.ONE的结果为 " + A);//1
		BigInteger B = BigInteger.TEN;
		System.out.println("BigInteger.TEN的结果为 " + B);//10
		BigInteger C = BigInteger.ZERO;
		System.out.println("BigInteger.ZERO的结果为 " + C);//0
		
		//初始化
		BigInteger c = new BigInteger("12345670",8);//c = 01234567890 ,八进制	
		System.out.println(c);//2739128
		BigInteger d = BigInteger.valueOf(100);//d = 100
		BigInteger e = new BigInteger(new byte[]{1,0});//00000001 00000000
		System.out.println(e);//256
		System.out.println(e.bitCount());
		System.out.println(e.bitLength());
		
		//运算
		System.out.println("请输入大整数a,b");	    
		while (cin.hasNext()) {//等同于!=EOF	
			BigInteger a = cin.nextBigInteger();
			BigInteger b = cin.nextBigInteger();
			BigInteger c1 = a.add(b); // 大数加法
			System.out.println("加的结果为 " + c1);
			BigInteger c2 = a.subtract(b); // 大数减法
			System.out.println("减的结果为 " + c2);
			BigInteger c3 = a.multiply(b); // 大数乘法
			System.out.println("乘的结果为 " + c3);
			BigInteger c4 = a.divide(b); // 大数除法
			System.out.println("除的结果为 " + c4);
			BigInteger c5 = a.mod(b);
			System.out.println("模的结果为 " + c5);
			BigInteger cc5 = a.remainder(b);
			System.out.println("余的结果为 " + cc5);
			BigInteger c6 = a.max(b);// 取最大
			System.out.println("最大为 " + c6);
			BigInteger c7 = a.min(b); // 取最小
			System.out.println("最小为 " + c7);
			BigInteger c8 = a.pow(10); //指数运算
			System.out.println("指数运算结果为" + c8);
			if (a.equals(b)) // 判断是否相等
				System.out.println("相等");
			else
				System.out.println("不相等");
			BigInteger c10 = a.abs(); // 求绝对值
			System.out.println("a的绝对值为 " + c10);
			BigInteger c11 = a.negate(); // 求相反数
			System.out.println("a的相反数为 " + c11);
		}
	}
}



BigDecimal表示:

//创建BigDecimal对象   

BigDecimal bigNumber = new BigDecimal("89.1234567890123456789");   

BigDecimal bigRate = new BigDecimal(1000);   

BigDecimal bigResult = new BigDecimal(); //对象bigResult的值为0.0   

注意,BigDecimal中的divide函数和BigInteger中的稍有不同。

方法1:
pubilc BigDecimal divide(BigDecimal divisor)    

API中的解释: 返回一个 BigDecimal,其值为 (this / divisor),其首选标度为 (this.scale() - divisor.scale());如果无法表示准确的商值(因为它有无穷的十进制扩展),则抛出 ArithmeticException。

方法2:
pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

scale指的是小数点后的位数。比如123.456则scale就是3是BigDecimal类中的方法啊。    比如:BigDecimal b = new BigDecimal("123.456");//b.scale(),返回的就是3.
  roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段

比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式,是四舍五入啊还是其它的,你可以自己选! 


方法3:
pubilc BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)


Fields
final public static BigDecimalZERO
zh_cn
值为 0,标度为 0。
since1.5
final public static BigDecimalONE
zh_cn
值为 1,标度为 0。
since1.5
final public static BigDecimalTEN
zh_cn
值为 10,标度为 0。
since1.5
final public static intROUND_UP
zh_cn
舍入远离零的舍入模式。在丢弃非零部分之前始终增加数字。注意,此舍入模式始终不会减少计算值的大小。
final public static intROUND_DOWN
zh_cn
接近零的舍入模式。在丢弃某部分之前始终不增加数字(即截短)。注意,此舍入模式始终不会增加计算值的大小。
final public static intROUND_CEILING
zh_cn
接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。注意,此舍入模式始终不会减少计算值。
final public static intROUND_FLOOR
zh_cn
接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。注意,此舍入模式始终不会增加计算值。
final public static intROUND_HALF_UP
zh_cn
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 >= 0.5,则舍入行为与ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式。
final public static intROUND_HALF_DOWN
zh_cn
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP相同;否则舍入行为与 ROUND_DOWN 相同。
final public static intROUND_HALF_EVEN
zh_cn
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
final public static intROUND_UNNECESSARY
zh_cn
断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出 ArithmeticException


与上面的大整数同样的函数:

package com.xujin;

import java.util.*;
import java.math.*;

public class Test {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		//BigDecimal类型的常量
		BigDecimal A = BigDecimal.ONE;
		System.out.println("BigDecimal.ONE的结果为 " + A);//1
		BigDecimal B = BigDecimal.TEN;
		System.out.println("BigDecimal.TEN的结果为 " + B);//10
		BigDecimal C = BigDecimal.ZERO;
		System.out.println("BigDecimal.ZERO的结果为 " + C);//0
		
		//初始化
		BigDecimal c = new BigDecimal("89.1234567890123456789");
		BigDecimal d = new BigDecimal(100);
		BigDecimal e = new BigDecimal(new char[]{'2','1','.','2'});		
		System.out.println(e);//21.2
		
		//运算
		System.out.println("请输入大整数a,b");	    
		while (cin.hasNext()) {//等同于!=EOF	
			BigDecimal a = cin.nextBigDecimal();
			BigDecimal b = cin.nextBigDecimal();
			BigDecimal c1 = a.add(b); // 大数加法
			System.out.println("加的结果为 " + c1);
			BigDecimal c2 = a.subtract(b); // 大数减法
			System.out.println("减的结果为 " + c2);
			BigDecimal c3 = a.multiply(b); // 大数乘法
			System.out.println("乘的结果为 " + c3);
			
			//注意,这里如果不能除尽,就会抛出一个ArithmeticException错误
			BigDecimal c4 = a.divide(b); // 大数除法
			System.out.println("除的结果为 " + c4);
			
			BigDecimal cc5 = a.remainder(b);
			System.out.println("余的结果为 " + cc5);
			BigDecimal c6 = a.max(b);// 取最大
			System.out.println("最大为 " + c6);
			BigDecimal c7 = a.min(b); // 取最小
			System.out.println("最小为 " + c7);
			BigDecimal c8 = a.pow(10); //指数运算
			System.out.println("指数运算结果为" + c8);
			if (a.equals(b)) // 判断是否相等
				System.out.println("相等");
			else
				System.out.println("不相等");
			BigDecimal c10 = a.abs(); // 求绝对值
			System.out.println("a的绝对值为 " + c10);
			BigDecimal c11 = a.negate(); // 求相反数
			System.out.println("a的相反数为 " + c11);
		}
	}
}



实用格式转换:

//去后缀0
  BigDecimal bd = new BigDecimal("12000.87300");
  bd = bd.stripTrailingZeros();
  System.out.println(bd);
  bd = new BigDecimal("1.2E-3");
//  bd = new BigDecimal("1.2E+3");
  //去科学记数
  if(bd.scale()<0){
   bd = bd.setScale(0);
  }
  System.out.println(bd);
  //保留N位小数.  N=5:
  bd = new BigDecimal("12000.873000");
  bd = bd.setScale(5, BigDecimal.ROUND_HALF_UP);
  System.out.println(bd); 



参考资料:
java API  http://doc.java.sun.com/DocWeb/api/java.math.BigDecimal

http://blog.163.com/wangyongfei_2008@yeah/blog/static/1722383292011535174177/
http://qingfengxia2.blog.163.com/blog/static/25478407201012442119977/
http://www.cnblogs.com/ffjjqqjj/archive/2011/07/14/2105893.html  等

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值