大家好,我是栗子为
又有好长时间没有更新文章了,小为刚踏入公司也步入正轨了,于是乎,想和大家分享一下在平时的项目中或者刷题的过程中经常会遇到的一个问题,就是处理一些大数或者一些小数点后很多位的小数,希望看完这篇的你,能对这两个类有个很好的掌握
废话不多说,我们一起来看看今天的干货
01
—
大数-BigInteger
我们在遇到一个非常大的整数时,第一反应会用long类型去进行存储,但它仍然有个范围,一旦我们需要存储的数超出了这个范围,那怎么去进行运算呢,别着急,今天聊的类就是专门来解决这些大数操作的
构造函数
常用的构造函数
BigInteger num1 = new BigInteger("68435168546"); // 默认是十进制
BigInteger num2 = new BigInteger("10100010101111110",2); // 通过这种方式可以指定进制
读入方式
和int类型一样,我们也可以通过Scanner直接从控制台拿到一个BigInteger
Scanner sc = new Scanner(System.in);
BigInteger num3 = sc.nextBigInteger();
BigInteger num4 = sc.nextBigInteger(2); // 同样的,可以指定进制
基本运算
BigInteger提供了很多方法,直接方便我们对两个数进行运算
Scanner sc = new Scanner(System.in);
BigInteger num1 = sc.nextBigInteger();
BigInteger num2 = sc.nextBigInteger();
System.out.println("num1:" + num1);
System.out.println("num2:" + num2);
System.out.println("开始运算.....");
System.out.println("num1 + num2 = " + num1.add(num2));
System.out.println("num1 - num2 = " + num1.subtract(num2));
System.out.println("num1 * num2 = " + num1.multiply(num2));
System.out.println("num1 / num2 = " + num1.divide(num2));
System.out.println("num1 mod num2 = " + num1.mod(num2));
System.out.println("num1 % num2 = " + num1.remainder(num2));
System.out.println("num1的2次方 = " + num1.pow(2));
System.out.println("num1的绝对值 = " + num1.abs());
System.out.println("num1的相反数 = " + num1.negate());
结果如下:
28 11
num1:28
num2:11
开始运算.....
num1 + num2 = 39
num1 - num2 = 17
num1 * num2 = 308
num1 / num2 = 2
num1 mod num2 = 6
num1 % num2 = 6
num1的2次方 = 784
num1的绝对值 = 28
num1的相反数 = -28
大小比较
BigInteger num1 = new BigInteger("55");
BigInteger num2 = new BigInteger("18");
int i = num1.compareTo(num2);
System.out.println(i); // 1表示num1大于num2 -1表示num1小于num2 0表示相等
System.out.println(num1.max(num2)); // 返回两者中大的那个
System.out.println(num1.min(num2));
类型转化
BigInteger num = new BigInteger("28");
int radix = 2; // 表示几进制
byte[] bytes = num.toByteArray(); // 转化为二进制补码形式
String s = num.toString();
String s1 = num.toString(radix);
int i = num.intValue();
long l = num.longValue();
float v = num.floatValue();
double v1 = num.doubleValue();
进制操作
同样地,BigInteger也能进行一些进制操作,如左移右移
BigInteger num1 = new BigInteger("10");
BigInteger num2 = new BigInteger("3");
BigInteger num3 = num1.and(num2); // 2
BigInteger num4 = num1.or(num2); // 11
BigInteger num5 = num1.xor(num2); // 9
BigInteger num6 = num1.not(); // -11
BigInteger num7 = num1.shiftLeft(1); // 20
BigInteger num8 = num1.shiftRight(1); // 5
大数的一些知识点就介绍完啦,接下来看看小数是怎么做的
02
—
小数-BigDecimal
在日常开发中,我们经常会使用到小数,例如金额的场景,double类型不能满足确切的精度要求,于是我们可以使用BigDecimal来准确地进行小数的运算
构造方法
首先来看看没有MathContext的构造方法
char[] charTest = {'1', '2'};
double doubleTest = 2.6;
int intTest = 2;
long longTest = 150L;
String stringTest = "354113";
BigDecimal bigDecimal1 = new BigDecimal(charTest);
BigDecimal bigDecimal2 = new BigDecimal(doubleTest);
BigDecimal bigDecimal3 = new BigDecimal(intTest);
BigDecimal bigDecimal4 = new BigDecimal(longTest);
BigDecimal bigDecimal5 = new BigDecimal(stringTest);
System.out.println(bigDecimal1);
System.out.println(bigDecimal2);
System.out.println(bigDecimal3);
System.out.println(bigDecimal4);
System.out.println(bigDecimal5);
什么是MathContext
先来看看MathContext的构造方法(摘自Java 8 API中文手册)
MathContext(int setPrecision) // 构造一个新的 MathContext具有指定的精度和 HALF_UP舍入模式。
MathContext(int setPrecision, RoundingMode setRoundingMode) // 构造一个新的 MathContext ,具有指定的精度和舍入模式。
MathContext(String val) // 从一个字符串构造一个新的 MathContext 。
举个栗子
double d1 = 11.55;
double d2 = 11.54;
MathContext mc = new MathContext(3); // 有效数字为3,所以会进行四舍五入
BigDecimal num1 = new BigDecimal(d1, mc); // 11.6
BigDecimal num2 = new BigDecimal(d2, mc); // 11.5
RoundingMode
这是一个枚举类型,用来指定舍入的算法
-
CEILING
向上舍入
-
DOWN
向0舍入
-
FLOOR
向下舍入
-
HALF_DOWN
最近舍入,如果相同大小,则向下舍入(例如,-3.5向下舍入为-3,2.5向下舍入为2)
-
HALF_EVEN
最近舍入,如果相同大小,则向偶数舍入
-
HALF_UP
默认的舍入算法,最近舍入,如果相同大小,则向上舍入(-3.5向上舍入为-4)
-
UNNECESSARY
要求数字不用舍入,如果需要舍入,则报异常
-
UP
舍入为绝对值更大的那个数(2.4舍入为3)
基本运算
BigDecimal num1 = new BigDecimal("1.00");
BigDecimal num2 = new BigDecimal("0.30");
System.out.println("num1 + num2 = " + num1.add(num2));
System.out.println("num1 - num2 = " + num1.subtract(num2));
System.out.println("num1 * num2 = " + num1.multiply(num2));
System.out.println("num1 / num2 = " + num1.divide(num2, BigDecimal.ROUND_HALF_UP));
System.out.println("num1除以num2的商 = " + num1.divideAndRemainder(num2)[0]);
System.out.println("num1除以num2的余数 = " + num1.divideAndRemainder(num2)[1]);
System.out.println("max = " + num1.max(num2));
System.out.println("min = " + num1.min(num2));
结果如下:
num1 + num2 = 1.30
num1 - num2 = 0.70
num1 * num2 = 0.3000
num1 / num2 = 3.33
num1除以num2的商 = 3
num1除以num2的余数 = 0.10
max = 1.00
min = 0.30
03
—
总结
以上就是关于Java中大数小数的一些使用方法,相信通过这一篇的学习,大家应该对这两个类不陌生了,本期的分享就到这咯,我们下次再见~
关注六只栗子,面试不迷路
作者 栗子为
编辑 一口栗子
原文始发于微信公众号(六只栗子):Java大数小数看完就会了
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88267.html