免费建站手机软件,石家庄网页定制开发,广水网站设计,代理网页浏览BigInteger和BigDecimal#xff1a;
我们在学习JavaSE基础的时候学习过int和double#xff0c;前者是整形#xff0c;后者是双精度浮点数#xff0c;但它们是有最大值的#xff0c;也就是说#xff0c;他两并不支持无限大的数字。
其范围如下所示#xff1a; 因此对于…BigInteger和BigDecimal
我们在学习JavaSE基础的时候学习过int和double前者是整形后者是双精度浮点数但它们是有最大值的也就是说他两并不支持无限大的数字。
其范围如下所示 因此对于特别大的数字Java为我们提供了两个类可用来操作分别是BigInteger[支持任意长度的整数]和BigDecimal[支持任意长度的浮点数]理论上可以存储无限长的数字只要你计算机的内存足够
创建
new BigXXX():
public static void main(String[] args) {//注意传递的参数是字符串而不是整数或者浮点数BigInteger bigIntegernew BigInteger(111111111111111111111111111111111);System.out.println(bigInteger);BigDecimal bigDecimalnew BigDecimal(1221345676867564534.123453678675645342);System.out.println(bigDecimal);}输出
111111111111111111111111111111111
1221345676867564534.123453678675645342BigXXX.ValueOf(): public static void main(String[] args) {BigDecimal bigDecimalBigDecimal.valueOf(12213456768678974.12);BigInteger bigIntegerBigInteger.valueOf(111111111111111L);System.out.println(bigInteger);System.out.println(bigDecimal);}输出
111111111111111
12213456768678974为什么这里打印出来的bigDecimal少了我们提供的一部分呢
问题不在BigDecimal而在ValueOf,我们提供的是double类型的而double类型的长度一般在15-17位因此17位以后得会被略掉因此比较好的办法还是使用构造方法的形式创建.
Scanner对象.BigXXX():
public static void main(String[] args) {Scanner scannernew Scanner(System.in);System.out.println(scanner.nextBigInteger());System.out.println(scanner.nextBigDecimal());}输出
111111111111111
111111111111111
111111111111111.32145
111111111111111.32145方法
add():相加
substract():相减
multiply:相乘
divide:相除
remainder():取余数
max():取最大值
min():取最小值
注意调用BigInteger的上述运算方法时不能直接传入整形数字原因如下所示
查看上述方法的源码 以相加为例
BigInteger bigInteger1new BigInteger(741258963);BigInteger bigInteger3bigInteger1.add(BigInteger.valueOf(2));System.out.println(bigInteger3);输出
741258965divideAndRemainder():得到商和余数 public static void main(String[] args) {BigInteger bigInteger1new BigInteger(741258963);BigInteger bigInteger2new BigInteger(457123698);BigInteger[] bigInteger3bigInteger1.divideAndRemainder(bigInteger2);//得到商System.out.println(bigInteger3[0]);//得到余数System.out.println(bigInteger3[1]);}注意该方法的返回值是一个BigInteger[]数组中第一个数字是商第二个数字是余数 compareTo()比较大小
public static void main(String[] args) {BigInteger bigInteger1new BigInteger(741258963);BigInteger bigInteger2new BigInteger(2);int resultbigInteger1.compareTo(bigInteger2);System.out.println(result);}输出
bigInteger1大于bigInteger2成立返回1否则返回-1相等返回0
1intValue():转换成int型和doubleValue():转换成double型
public static void main(String[] args) {BigInteger bigInteger2new BigInteger(2);int num1 bigInteger2.intValue();Double num2 bigInteger2.doubleValue();System.out.println(num1);System.out.println(num2);}输出
2
2.0上述方法对于BigDecimal对象同样适用这里就不过多举例。
注意BigDecimal对象的divide需要注意的地方如下所示 public static void main(String[] args) {BigDecimal bigDecimalnew BigDecimal(3.14159);//未做任何处理BigDecimal bigDecimal1bigDecimal.divide(BigDecimal.valueOf(2));System.out.println(bigDecimal1);//RoundingMode.HALF_UP-四舍五入BigDecimal bigDecimal2bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.HALF_UP);System.out.println(bigDecimal2);//RoundingMode.UP-向上取整BigDecimal bigDecimal3bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.UP);System.out.println(bigDecimal3);//RoundingMode.DOWN-向下取整BigDecimal bigDecimal4bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.DOWN);System.out.println(bigDecimal4);}输出
默认保留和提供的bigDecimal对象相同的位数
1.570795
1.57080
1.57080
1.57079实现进制之间的转换:
public static void main(String[] args) {//二进制转化为10进制int numInteger.parseInt(001,2);System.out.println(num);//十六进制转化为10进制int num1Integer.parseInt(D,16);System.out.println(num1);//八进制转化为10进制int num2Integer.parseInt(00012,8);System.out.println(num2);}输出如下所示
1
13
10但是当数据过大的情况下就会抛出异常 public static void main(String[] args) {int num3Integer.parseInt(7418529633217965412369874,16);System.out.println(num3);}输出如下所示 那么我们可以使用大数类解决这个问题 public static void main(String[] args) {BigInteger bigIntegernew BigInteger(ABCDEF123,16);System.out.println(bigInteger);}输出如下所示
46118400291