写在最后
在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。
需要完整版PDF学习资源私我
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
| multiply(BigInteger val) | 做乘法运算 |
| divide(BigInteger val) | 做除法运算 |
| remainder(BigInteger val) | 做取余数运算 |
| divideAndRemainder(BigInteger val) | 做除法运算,返回数组的第一个值为商,第二个值为余数 |
| pow(int exponent) | 做参数的 exponent 次方运算 |
| negate() | 取相反数 |
| shiftLeft(int n) | 将数字左移 n 位,如果 n 为负数,则做右移操作 |
| shiftRight(int n) | 将数字右移 n 位,如果 n 为负数,则做左移操作 |
| and(BigInteger val) | 做与运算 |
| or(BigInteger val) | 做或运算 |
| compareTo(BigInteger val) | 做数字的比较运算 |
| equals(Object obj) | 当参数 obj 是 Biglnteger 类型的数字并且数值相等时返回 true, 其他返回 false |
| min(BigInteger val) | 返回较小的数值 |
| max(BigInteger val) | 返回较大的数值 |
2.2 基本案例
我们先来通过一个案例,来验证一下BigInteger中的数字到底有多大。
public static void main(String[] args) {
//创建一个BigInteger对象
BigInteger bi = new BigInteger("1234567890");
//计算1234567890的15次方,
//结果=23589821655914838120947036369147203948318169938519404175968425823418008249115809912616071588527110255905622789563711716349000000000000000
System.out.println(bi.pow(15));
}
我们会发现,BigInteger可以表示一个非常大的数字,比Integer、Long的范围都要大。
2.3 类型转换
在上面说过,BigInteger其实是Number的子类,我们知道,Number中定义了几个负责类型转换的方法,比如:
● 转换为byte:byteValue()
● 转换为short:shortValue()
● 转换为int:intValue()
● 转换为long:longValue()
● 转换为float:floatValue()
● 转换为double:doubleValue()
我们利用上述几个方法,就可以把BigInteger转换成基本类型。
但是大家要注意,如果BigInteger表示的范围超过了基本类型的范围,在转换时会丢失高位信息,也就是说,结果不一定准确。 所以如果我们需要准确地转换成基本类型,可以使用intValueExact()、longValueExact()这样的方法。不过这种方法在转换时如果超出了基本类型的范围,会直接抛出ArithmeticException异常。我们来验证一下吧。
但是如果BigInteger的值超过了float的最大范围(3.4x1038),结果并不会出现ArithmeticException异常,而是会出现Infinity,如下所示:
//计算999999的99次方,并得到该结果的float值
BigInteger bi03 = new BigInteger("999999").pow(99);
float f = bi03.floatValue();
System.out.println("结果="+f);
2.4 其他用法
接下来我们再来看看其他的API方法都有哪些作用。
import java.math.BigInteger;
import java.util.Scanner;
public class Demo10 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
// 保存用户输入的数字
int num = scanner.nextInt();
// 使用输入的数字创建BigInteger对象
BigInteger bi = new BigInteger(num + "");
// 计算大数字加上99的结果
System.out.println("加法的结果:" + bi.add(new BigInteger("99")));
// 计算大数字减去25的结果
System.out.println("减法的结果:" + bi.subtract(new BigInteger("25")));
// 计算大数字乘以3的结果
System.out.println("乘法的结果:" + bi.multiply(new BigInteger("3")));
// 计算大数字除以2的结果
System.out.println("除法的结果:" + bi.divide(new BigInteger("2")));
// 计算大数字除以3的商
System.out.println("取商的结果:" + bi.divideAndRemainder(new BigInteger("3"))[0]);
// 计算大数字除以3的余数
System.out.println("取余的结果:" + bi.divideAndRemainder(new BigInteger("3"))[1]);
// 计算大数字的4次方
System.out.println("4次方的结果:" + bi.pow(4));
// 计算大数字的相反数
System.out.println("取反的结果:" + bi.negate());
}
}
在上述案例中,我们将用户输入的数字作为 BigInteger 对象的参数,然后调用该对象的各种方法,实现了加、减、乘、除等运算,并输出了最终的结果。
二. BigDecimal类
1. 简介
虽然都是用于大数字运算的类,但BigDecimal加入了小数的概念,所以是可以操作小数的。而float 和 double类型,只能用来进行科学计算或工程计算,并不适用于精度要求较高的商业计算(如货币计算),所以要用到支持任何精度的BigDecimal类。该类中提供了一系列对应的方法,可以用来做超大浮点数的运算,像加、减、乘和除等。在所有运算中,除法运算是最复杂的,因为存在除不尽的情况,需要我们考虑末位小数的处理方式。
2. 使用方法
2.1 常用构造方法
以下是BigDecimal类的常用构造方法:
● BigDecimal(double val):实例化对象时可以将双精度型转换为BigDecimal类型;
● BigDecimal(String val):实例化对象时可以将字符串形式转换为BigDecimal类型。
2.2 常用API方法
除了构造方法之外,BigDecimal还提供了一些常用的API方法供我们进行数学运算。这些方法与BigInteger的方法类型,很多方法名称和用法也都与之一致,所以这里壹哥就不再一一列出了,接下来我就直接通过一个案例给大家演示这些方法如何使用。
import java.math.BigDecimal;
public class Demo11 {
public static void main(String[] args) {
BigDecimal bd = new BigDecimal("1000.05800");
// 计算大数字加上99的结果
System.out.println("加法的结果:" + bd.add(new BigDecimal("99")));
// 计算大数字减去25的结果
System.out.println("减法的结果:" + bd.subtract(new BigDecimal("25")));
// 计算大数字乘以1000的结果
System.out.println("乘法的结果:" + bd.multiply(new BigDecimal(1000)));
//获取小数的位数,5
System.out.println(bd.scale());
//去掉BigDecimal末尾的0,返回一个与原有BigDecimal相等的新对象
BigDecimal bd2 = bd.stripTrailingZeros();
System.out.println(bd2.scale());
}
}
在上述代码中,stripTrailingZeros()方法用于去掉BigDecimal末尾的0,并返回一个与原有BigDecimal相等的新对象。而scale()方法用于获取一个数字后面0的个数,如果返回的是负数,比如-2,则表示该数是一个整数,且末尾有2个0。
2.3 divide()除法
BigDecimal进行加、减、乘时,数字的精度不会丢失,但是进行除法运算时,有可能会出现无法除尽的情况,此时必须指定精度以及如何进行截断。BigDecimal给我们提供了divide()和divideAndRemainder()两个方法可以进行除法运算。
其中,divide()方法有3个参数分别表示除数、商的小数点后的位数和近似值的处理模式,下表是给大家列出的roundingMode参数支持的处理模式。
模式名称 | 说明 |
---|---|
BigDecimal.ROUND_UP | 商的最后一位,如果大于 0,则向前进位,正负数都如此。 |
BigDecimal.ROUND_DOWN | 商的最后一位无论是什么数字都省略 |
BigDecimal.ROUND_CEILING | 商如果是正数,按照 ROUND_UP 模式处理;如果是负数,按照 ROUND_DOWN模式处理 |
BigDecimal.ROUND_FLOOR | 与 ROUND_CELING 模式相反,商如果是正数,按照 ROUND_DOWN 模式处理;如果是负数,按照 ROUND_UP 模式处理 |
BigDecimal.ROUND_HALF_ DOWN | 对商进行五舍六入操作。如果商最后一位小于等于 5,则做舍弃操作,否则对最后一位进行进位操作 |
BigDecimal.ROUND_HALF_UP | 对商进行四舍五入操作。如果商最后一位小于 5,则做舍弃操作,否则对最后一位进行进位操作 |
BigDecimal.ROUND_HALF_EVEN | 如果商的倒数第二位是奇数,则按照 ROUND_HALF_UP 处理;如果是偶数,则按照 ROUND_HALF_DOWN 处理 |
import java.math.BigDecimal;
import java.math.RoundingMode;
/\*\*
\* @author 一一哥Sun
\*/
public class Demo12 {
public static void main(String[] args) {
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("123.456789");
// 会产生ArithmeticException异常,因为除不尽,可以设置RoundingMode,按照指定的方法进行四舍五入或者直接截断:
//BigDecimal d3 = d1.divide(d2);
// 保留10位小数并四舍五入
BigDecimal d4 = d1.divide(d2, 10, RoundingMode.HALF_UP);
System.out.println("d4="+d4);
//按指定的位数直接截断,0.xxxx
BigDecimal d5 = d1.divide(d2, 4, RoundingMode.DOWN);
System.out.println("d5="+d5);
}
}
2.4 divideAndRemainder()除法
而divideAndRemainder()方法,会返回一个数组,内部包含两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数,所以我们可以利用这个方法来判断两个BigDecimal是否是整数倍数。
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Demo12 {
public static void main(String[] args) {
//divideAndRemainder方法,返回一个数组,该数组内部包含了两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数。
//我们可以利用这个特性来判断两个BigDecimal是否是整数倍数。
BigDecimal n = new BigDecimal("123.456");
BigDecimal m = new BigDecimal("0.123");
BigDecimal[] dr = n.divideAndRemainder(m);
**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7**
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/e727ef1aa4e8b7b18201a9ea1877e1c6.png)
![img](https://img-blog.csdnimg.cn/img_convert/260f8c6fe933b078012acf7e2753c616.png)
![img](https://img-blog.csdnimg.cn/img_convert/01a645f28a689dff0dbc2d487ad52bb2.png)
![img](https://img-blog.csdnimg.cn/img_convert/9bff9af9d452b7f1a95d3e06e3ca1fa2.png)
![img](https://img-blog.csdnimg.cn/img_convert/4e04563391fe5e9c548f08dce5c7ceb8.png)
![img](https://img-blog.csdnimg.cn/img_convert/f72cfd1acd6b7774e4cde28208dde721.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**
[外链图片转存中...(img-HzF6Qdag-1715169875590)]
[外链图片转存中...(img-IoFWbbjG-1715169875591)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**