java中的BigInteger类和BigDecimal类的应用

时间:2022-04-07 15:37:14

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 BigDecimal ZERO
zh_cn
值为 0,标度为 0。
since 1.5
final public static BigDecimal ONE
zh_cn
值为 1,标度为 0。
since 1.5
final public static BigDecimal TEN
zh_cn
值为 10,标度为 0。
since 1.5
final public static int ROUND_UP
zh_cn
舍入远离零的舍入模式。在丢弃非零部分之前始终增加数字。注意,此舍入模式始终不会减少计算值的大小。
final public static int ROUND_DOWN
zh_cn
接近零的舍入模式。在丢弃某部分之前始终不增加数字(即截短)。注意,此舍入模式始终不会增加计算值的大小。
final public static int ROUND_CEILING
zh_cn
接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。注意,此舍入模式始终不会减少计算值。
final public static int ROUND_FLOOR
zh_cn
接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。注意,此舍入模式始终不会增加计算值。
final public static int ROUND_HALF_UP
zh_cn
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分 >= 0.5,则舍入行为与ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。注意,这是我们大多数人在小学时就学过的舍入模式。
final public static int ROUND_HALF_DOWN
zh_cn
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP相同;否则舍入行为与 ROUND_DOWN 相同。
final public static int ROUND_HALF_EVEN
zh_cn
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
final public static int ROUND_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  等