BigInteger
1、赋值:
1、BigInteger a=new BigInteger("1");
2、BigInteger b=BigInteger.valueOf(1);
3、A=BigInteger.ONE 1
4、B=BigInteger.TEN 10
5、C=BigInteger.ZERO 0
6、n.compareTo(BigInteger.ZERO)==0 //相当于n==0
7、if(a[i].compareTo(n)>=0 &&a[i].compareTo(m)<=0) // a[i]>=n && a[i]<=m
2、运算 :
大数的加减运算不同于普通整数的加减乘除运算
1 加—— a+b: a=a.add(b);
2 减—— a-b: a=a.subtract(b);
3 乘—— a*b: a=a.multiply(b);
4 除—— a/b: a=a.divide(b);
5 求余—a%b: a=a.mod(b);
6 转换—a=b: b=BigInteger.valueOf(a);
7 去反数—— -a:a.negate()
8 幂——a^b: a.pow(b)
9 绝对值——|c|:c.abc()
10 最大公约数——gcd(a,b)=a.gcd(b)
11比较 if (ans.compareTo(x) == 0) System.out.println("相等")
3.BigInteger与String:
1、将指定字符串转换为十进制表示形式;
BigInteger(String val);
2、将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger
BigInteger(String val,int radix);
3、BigInteger 的十进制字符串表示形式
BigInteger(str,radix)
4、 BigInteger 的给定基数的字符串表示形式
toString(int radix)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package Content;
import java.util.*;
import java.math.BigInteger;
public class BigNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//大数类型不能直接赋值
BigInteger num1 = BigInteger.ONE; // <=> BigInteger num1 = BigInteger.valueOf(1);
BigInteger num2 = BigInteger.valueOf(2);
System.out.println("num1 = "+num1);
System.out.println("num2 = "+num2);
BigInteger a,b,c;
BigInteger ans_add,ans_sub,ans_mul,ans_div,ans_mod,ans_gcd;
a = scanner.nextBigInteger();
b = scanner.nextBigInteger();
c = scanner.nextBigInteger();
System.out.println("a = "+ a);
System.out.println("b = "+ b);
System.out.println("a反数="+a.negate());
System.out.println("|c|="+ c.abs());
System.out.println("c^2="+c.pow(2));
ans_add = a.add(b); //a+b
ans_sub = a.subtract(b); //a-b
ans_mul = a.multiply(b); //a*b
ans_div = a.divide(b); //a/b
ans_mod = a.mod(b); //a%b
ans_gcd = a.gcd(b);// gcd(a,b)
System.out.println("a + b = "+ans_add);
System.out.println("a - b = "+ans_sub);
System.out.println("a * b = "+ans_mul);
System.out.println("a / b = "+ans_div);
System.out.println("a % b = "+ans_mod);
System.out.println("gcd(a,b)="+ans_gcd);
//比较
if (a.compareTo(b) == 0) {
System.out.println("相等");
}else {
System.out.println("不相等");
}
//BigInteger类型转换成Long类型或int类型问题
int i = a.intValue();
long l = b.longValue();
float f = a.floatValue();
double d = b.doubleValue();
System.out.println(i);
System.out.println(l);
System.out.println(f);
System.out.println(d);
//转换 :(十进制)String<=>BigInteger
System.out.println("String=>BigInteger:");
String string1 = "12345";
BigInteger bigInteger1 = new BigInteger(string1);
System.out.println("BigInteger = "+bigInteger1);
System.out.println("BigInteger=>String:");
System.out.println(bigInteger1.toString());
//转换:(*进制)String<=>BigInteger
String string2 = "1000";
BigInteger bigInteger2 = new BigInteger(string2,2);
System.out.println("string="+string2);
System.out.println("BigInteger = "+bigInteger2);
System.out.println("BigInteger=>String:");
System.out.println(bigInteger1.toString(2));
}
}
BigDecimal
BigDecimal的实现利用到了BigInteger, 所不同的是,BigDecimal加入了小数位的概念。
BigDecimal d = new BigDecimal(new BigInteger(ib),5);
5表示的是5个小数位。
BigDecimal可以用来做超大的浮点数的运算,比如+-*/的运算,其中除法运算是最复杂的。因为,在商的位数还有除不断的情况下,末位小数点的处理都是需要考虑的。
new BigDecimal(-7.5).divide(new BigDecimal(1),0,BigDecimal.ROUND_UP);
上面的这个运算中divide的第二个参数表示商的小数点位数,最后一个参数指的是近似处理的模式。
Java的基本类型提供了float和double类型,但他们在执行浮点运算的时候,只是提供了一个较为精确的结果,不能用于要求精确度很高的环境中。
因此,Java提供了BigDecimal类来保证结果的精确度。
BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做运算时千万要保存操作后的值。
使用BigDecimal的坏处是性能比double和float差,在处理庞大,复杂的运算时尤为明显,因根据实际需求决定使用哪种类型。
构造方法
BigDecimal(int):创建一个具有参数所指定整数值的对象。
BigDecimal(double):创建一个具有参数所指定双精度值的对象(不建议使用)。
BigDecimal(String):创建一个具有参数所指定以字符串表示的数值的对象。
BigDecimal add(BigDecimal augend):加法运算。
BigDecimal subtract(BigDecimal subtrahend):减法运算。
BigDecimal multiply(BigDecimal multiplicand):乘法运算。
BigDecimal divide(BigDecimal divisor):除法运算,可能会产生除零异常和不能整除异常。
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode):除法运算,可传入精确小数位数scale,和舍入模式roundingMode。
BigDecimal[] divideAndRemainder(BigDecimal divisor):获取商值和余数组成的数组,初始元素是商值,最终元素是余数。
BigDecimal setScale(int newScale, int roundingMode):进行舍入操作。
String toString():将BigDecimal对象的数值转换成字符串。
double doubleValue():将BigDecimal对象中的值以双精度数返回。
float floatValue():将BigDecimal对象中的值以单精度数返回。
int intValue():将BigDecimal对象中的值以整数返回。
BigDecimal.setScale()方法用于格式化小数点
setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
1、scale指的是你小数点后的位数。比如123.456则score就是3.
比如:BigDecimal b = new BigDecimal("123.456");
<1> BigDecimal num1 = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失
<2> BigDecimal num2 = new BigDecimal(2);//这种写法是可以的
<3>BigDecimal num = new BigDecimal("2.225667");//一般都会这样写最好
b.scale(),返回的就是3.
2、roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3、pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式,例如:是四舍五入
舍入模式
BigDecimal.ROUND_UP:最后一位如果大于0,则向前进一位,正负数都如此。
BigDecimal.ROUND_DOWN:最后一位不管是什么都会被舍弃。
BigDecimal.ROUND_CEILING:如果是正数,按ROUND_UP处理;如果是负数,按照ROUND_DOWN处理。例如,7.1->8;-7.1->-7。所以,这种近似的结果都会>=实际值。
BigDecimal.ROUND_FLOOR:跟BigDecimal_ROUND_CEILING相反。例如,7.1->7;-7.1->-8。这种处理的结果<=实际值。
BigDecimal.ROUND_HALF_DOWN:如果最后一位<=5则舍弃,如果>5, 向前进一位。如,7.5->7;7.6->8;-7.5->-7 。
BigDecimal.ROUND_HALF_UP:如果最后一位<5则舍弃,如果>=5, 向前进一位。反之舍弃。如,7.5->8;7.4->7;-7.5->-8 。
BigDecimal.ROUND_HALF_EVEN:如果倒数第二位是奇数,按照BigDecimal.ROUND_HALF_UP处理;如果是偶数,按照BigDecimal.ROUND_HALF_DOWN来处理。如,7.5->8;8.5->8;7.4->7;-7.5->-8。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package Content; import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; public class BigDecimalDemo { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); BigDecimal bigDecimal1 = new BigDecimal(6); BigDecimal bigDecimal2 = new BigDecimal("123"); BigDecimal bigDecimal3 = new BigDecimal(25.234443535);//不推荐使用,容易造成精度损失 BigDecimal bigDecimal4 = new BigDecimal("25.234443535"); System.out.println("bigDecimal1"+bigDecimal1); System.out.println("bigDecimal2"+bigDecimal2); System.out.println("bigDecimal3"+bigDecimal3); System.out.println("bigDecimal4"+bigDecimal4); System.out.println(" "); BigDecimal bigDecimal = new BigDecimal("6.87654321"); //bigDecimal.setScale(2); //会出错,要指定舍入模式 //System.out.println(new BigDecimal("1225.120").setScale(2));//不会出错 System.out.println(bigDecimal.setScale(10)); System.out.println("bigDecimal.scale="+bigDecimal.scale()); System.out.println("BigDecimal.ROUND_UP"+bigDecimal.setScale(3,BigDecimal.ROUND_UP)); System.out.println("BigDecimal.ROUND_DOWN :"+bigDecimal.setScale(3,BigDecimal.ROUND_DOWN)); System.out.println("BigDecimal.ROUND_CEILING: "+bigDecimal.setScale(3,BigDecimal.ROUND_CEILING)); System.out.println("BigDecimal.ROUND_FLOOR"+bigDecimal.setScale(3,BigDecimal.ROUND_FLOOR)); System.out.println("BigDecimal.ROUND_HALF_UP"+bigDecimal.setScale(3,BigDecimal.ROUND_HALF_UP)); System.out.println("BigDecimal.ROUND_HALF_DOWN"+bigDecimal.setScale(3,BigDecimal.ROUND_HALF_DOWN)); System.out.println("ROUND_HALF_EVEN"+bigDecimal.setScale(3,BigDecimal.ROUND_HALF_EVEN)); BigDecimal bigDecimall = new BigDecimal(6.1); } }