import java.math.BigInteger;
import org.junit.Test;
/*
* ☆玩转大数(BigInteger):
* 1.基本数据类型的值要转换成大数(经常会用到),用下面两种方法
* 1)构造方法
* 2)valueOf()方法
* 2.加、减、乘、除、取模等常用数学运算全部用函数来实现,不能数学用运算符。
* 并且一般的函数参数都是大数对象,不能用数值,也不能用整数及包装类变量。
* 还要注意,一般的函数在进行大数运算时,不是原地修改,而是返回修改结果。
* 3.每个大数变量是一个BigInteger类型的对象,不是普通变量,也不是一个数值
*
*/
public class BigIntegerDemo {
@Test//计算阶乘n! ---基本数据类型的实现方式
public void demo1(){
long lg = jc1(500);
System.out.println(lg);
}
public long jc1(int n){
long s = 1;
for(int i=1; i<=n; i++){
s = s*i;
}
return s;
}
@Test//计算阶乘n! ---BigInteger的实现方式
public void demo2(){
BigInteger lg = jc2(500);
System.out.println( lg );
}
public BigInteger jc2(int n){
BigInteger s = new BigInteger("1"); //把1转换成大数---法1:构造方法
for(int i=1; i<=n; i++){
s = s.multiply( BigInteger.valueOf(i) ); //把i转换成大数---法2:valueOf()方法
}
return s;
}
}
import java.math.BigDecimal;
import org.junit.Test;
/*
* 继续玩转大数:
*
* BigDecimal的用法和BigInteger非常类似,因为都是大数。
* 因此也没有普通的数学运算符操作(+,-,*,/,%),所有这些操作都是通过函数
* 来实现的,并且一般的函数参数也都是大数(BigDecimal或BigInteger对象)
*
*/
public class BigDecimalDemo {
@Test//采用double会出现10个0.1相加结果不为1,这种近似运算方式经常不符合工程需要
public void demo() {
double sum = 0.0;
for(int i=0;i<10;i++){
sum +=0.1;
}
System.out.println(sum);
}
@Test//采用BigDecimal可以满足小数运算的工程需要
public void demo2() {
BigDecimal d = new BigDecimal(0);
for(int i=0;i<10;i++){
d = d.add( new BigDecimal(0.1) );
}
//scale指的是: 小数点后精确到几位
d = d.divide( BigDecimal.valueOf(1), 2, BigDecimal.ROUND_HALF_UP);
System.out.println(d);
}
@Test
public void demo3(){
BigDecimal d=new BigDecimal(0);
for(int i=0;i<10;i++){
d=d.add(BigDecimal.valueOf(0.1));
}
System.out.println(d);
}
@Test
public void demo4(){
BigDecimal d=new BigDecimal(0);
for(int i=0;i<10;i++){
d=d.add(new BigDecimal(0.1));
}
System.out.printf("%.1f",d);
}
}