玩转大数(BigInteger):
1.基本数据类型的值要转换成大数(经常会用到),用下面两种方法1)构造方法
2)valueOf()方法
2.加、减、乘、除、取模等常用数学运算全部用函数来实现,不能数学用运算符。 并且一般的函数参数都是大数对象,不能用数值,也不能用整数及包装类变量。 还要注意,一般的函数在进行大数运算时,不是原地修改,而是返回修改结果。
3.每个大数变量是一个BigInteger类型的对象,不是普通变量,也不是一个数值
import java.math.BigInteger;
import org.junit.Test;
/**
* Time:2018/4/5
* Description:学习BigInteger类
* @author 宋进宇
*/
public class BigIntegerDemo {
@Test
public void test1(){
long l = factorial(50);
System.out.println(l);
//-3258495067890909184 输出结果为负数,说明结果超过long型值的范围
}
/**
* 基本数据类型求阶乘i!
* @param i-阶乘因子
* @return 阶乘结果
*/
private long factorial(int i) {
long l=1;
for (int j = 2; j <= i; j++) {
l*=j;
}
return l;
}
@Test
public void test2(){
BigInteger bi = factorial2(50);
System.out.println(bi);
//30414093201713378043612608166064768844377641568960512000000000000
//结果正确
}
/**
* BigInteger求阶乘i!
* @param i-阶乘因子
* @return 阶乘结果
*/
private BigInteger factorial2(int i) {
BigInteger bi = BigInteger.ONE;
for (int j = 2; j <= i; j++) {
bi = bi.multiply(BigInteger.valueOf(j));
}
return bi;
}
}
玩转BigDecimal:
BigDecimal的用法和BigInteger非常类似,因为都是大数。 因此也没有普通的数学运算符操作(+,-,*,/,%),所有这些操作都是通过函数来实现的,并且一般的函数参数也都是大数(BigDecimal或BigInteger对象)
import java.math.BigDecimal;
import org.junit.Test;
/**
* Time:2018/4/5
* Description:BigDecimal类的学习
* @author 宋进宇
*/
public class BigDecimalDemo {
@Test
public void test1(){
double sum = 0.0;
for (int i = 0; i < 10; i++) {
sum+=0.1;
}
System.out.println(sum);
//结果为0.9999999999999999
//按常理来说结果应该为1.0,但是由于浮点数运算结果有时会是近似值,
//有时会是正确值,比如当i等于5是结果为:0.5是想要的结果。
//因此我们可以采用BigDecimal来进行处理,它可以精确计算
}
@Test
public void test2(){
BigDecimal bd = new BigDecimal(0);
for (int i = 0; i < 10; i++) {
bd = bd.add(BigDecimal.valueOf(0.1));
//bd = bd.add(new BigDecimal(0.1));
}
System.out.println(bd);
//结果为1.0是我们想要的结果
//但是要注意,使用BigDecimal时,add()方法里面的参数应该用BigDecimal.valueOf(0.1)
//如果参数用new BigDecimal(0.1)会出现
//1.0000000000000000555111512312578270211815834045410156250
//所以使用BigDecimal进行运算时,参数用BigDecimal.valueOf(0.1)这种方式。
}
}