从零开始学Java61之大数字处理相关的类有哪些?_java计算数字计算类

还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!

王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。

对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!

【完整版领取方式在文末!!】

93道网络安全面试题

内容实在太多,不一一截图了

黑客学习资源推荐

最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

1️⃣零基础入门
① 学习路线

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

image

② 路线对应学习视频

同时每个成长路线对应的板块都有配套的视频提供:

image-20231025112050764

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在上面说过,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);
        System.out.println(dr[0]); // 1003
        System.out.println(dr[1]); // 0.087
        
        if (dr[1].signum() == 0) {
            // n是m的整数倍
        	System.out.println("n是m的整数倍"); 
        }else {
        	System.out.println("n不是m的整数倍"); 
        }
	}
}

3. 比较两个BigDecimal

如果我们想比较两个BigDecimal的值是否相等,需要特别注意,请不要使用equals()方法,因为使用该方式进行比较时,不但要求两个BigDecimal的值相等,还要求它们的scale()结果也相等。所以一般是建议使用compareTo()方法来比较,它会根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。如下所示:

import java.math.BigDecimal;

/\*\*
 \* @author 一一哥Sun
 \*/
public class Demo13 {

	public static void main(String[] args) {
		BigDecimal d1 = new BigDecimal("123.456");
		BigDecimal d2 = new BigDecimal("123.456000");
		// false,因为scale不同
		System.out.println("d1==d2? "+d1.equals(d2)); 
		// true,因为d2去除尾部0后scale变为2
		System.out.println("d1==d2? "+d1.equals(d2.stripTrailingZeros())); 
		 //结果=0,负数表示小于,正数表示大于,0表示等于
		System.out.println("d1==d2? "+d1.compareTo(d2));
	}



本人从事网路安全工作12年,曾在2个大厂工作过,安全服务、售后服务、售前、攻防比赛、安全讲师、销售经理等职位都做过,对这个行业了解比较全面。


最近遍览了各种网络安全类的文章,内容参差不齐,其中不伐有大佬倾力教学,也有各种不良机构浑水摸鱼,在收到几条私信,发现大家对一套完整的系统的网络安全从学习路线到学习资料,甚至是工具有着不小的需求。


最后,我将这部分内容融会贯通成了一套282G的网络安全资料包,所有类目条理清晰,知识点层层递进,需要的小伙伴可以点击下方小卡片领取哦!下面就开始进入正题,如何从一个萌新一步一步进入网络安全行业。


![](https://img-blog.csdnimg.cn/img_convert/311903982dea1d8a5d2c98fc271b5b41.jpeg)



### 学习路线图


 其中最为瞩目也是最为基础的就是网络安全学习路线图,这里我给大家分享一份打磨了3个月,已经更新到4.0版本的网络安全学习路线图。


相比起繁琐的文字,还是生动的视频教程更加适合零基础的同学们学习,这里也是整理了一份与上述学习路线一一对应的网络安全视频教程。


![](https://img-blog.csdnimg.cn/img_convert/1ddfaf7dc5879b1120e31fafa1ad4dc7.jpeg)


#### 网络安全工具箱


当然,当你入门之后,仅仅是视频教程已经不能满足你的需求了,你肯定需要学习各种工具的使用以及大量的实战项目,这里也分享一份**我自己整理的网络安全入门工具以及使用教程和实战。**


![](https://img-blog.csdnimg.cn/img_convert/bcd1787ce996787388468bb227d8f959.jpeg)


#### 项目实战


最后就是项目实战,这里带来的是**SRC资料&HW资料**,毕竟实战是检验真理的唯一标准嘛~


![](https://img-blog.csdnimg.cn/img_convert/35fc46df24091ce3c9a5032a9919b755.jpeg)


#### 面试题


归根结底,我们的最终目的都是为了就业,所以这份结合了多位朋友的亲身经验打磨的面试题合集你绝对不能错过!

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值