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); } }