最新要闻
- 深圳:港澳青年在深创业个人最高可贷60万元
- 苹果联合创始人炮轰马斯克自动驾驶画饼:想死就买特斯拉!
- 李佳琦面试75岁奶奶主播引围观:老人直呼为推广国货努力 这是国家自信
- 开封市通许县四所楼镇:让社情民意联络点当好民声传话筒|全球快讯
- 支持华为HMS服务!酷比魔方Pad 50Pro发布 首发899元
- 世界热点评!陌陌被苹果下架 官方回应:技术问题正解决 老用户不影响
- 这五一超20万人去淄博:鲁C变身网红旅游名城_快资讯
- 当前讯息:怎么看?老人欲插队被服务员严词拒绝:前有插队婆孙被网曝 还被做车贴很恶心
- 功能不成熟 马斯克推特直播秒变马赛克 网友吐槽:8-Bit埃隆_世界新要闻
- 今年全国快递业务量突破400亿件
- 坎普斯boss怎么打_坎普斯怎么打_当前快讯
- 一机多用:劲能电钻/电动螺丝刀39元起(100元大额券) 每日速递
- 【天天热闻】向华为供货740万块硬盘 被重罚3亿美元!希捷:已和解并开始付罚金
- 当前观点:特斯拉公共充电桩功率仅23KW 比亚迪车主一度愧疚:把人家功率吸走了
- 又一五菱神车!宝骏悦也5月15日首发:车尾背个“大手表”
- iPhone平均售价越来越高了!Pro和Pro Max最受果粉喜爱
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【天天速看料】Java基础学习之大数字处理相关的类有哪些?
前言
我们知道,在现实世界里,实际上数字是有无穷个的,就比如0和1之间,你说有多少个数字?
无数个!
【资料图】
但是在计算机中,数字的个数其实是有限的,因为计算机有存储空间的限制,所以实际上无论是整数还是浮点数,都是有最大范围的。比如在Java中,整型的最大范围是64位的long型整数。
但是有的小伙伴问了,如果我们使用的整数超过了long型的范围怎么办?此时,我们可以通过软件来模拟一个大整数或大浮点数。
在Java中提供了两个用于大数字运算的类,分别是java.math.BigInteger
类和java.math.BigDecimal
类。
这两个类都可以用于高精度计算,BigInteger类是针对整型大数字的处理类,而BigDecimal类是针对大小数的处理类,我们可以用它们来表示任意大小的整数和浮点数。接下来我们就带大家来学习一下,在Java中如何处理大数字。
全文大约 【3800】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考......
一.BigInteger类
1.简介
在之前给大家讲解8种基本类型时就说过,不同的数据类型,有不同的取值范围,我们再通过下表回顾一下:
类型 | 所占字节(byte) | 所占位数(bit) | 取值范围 |
---|---|---|---|
byte | 1 | 8 | -2^7~2^7-1 |
short | 2 | 16 | -2^15~2^15-1 |
int | 4 | 32 | -2^31~2^31-1 |
long | 8 | 64 | -2^63~2^63-1 |
char | 2字节 | 16位 | 0~65535 |
float | 4字节 | 32位 | ±3.4E+38 |
double | 8字节 | 64位 | ±1.7E+308 |
boolean | 4字节 | 32位 | true\false |
从上表中我们可以看到,整型的最大取值范围是-2^63~2^63-1
,浮点型的最大取值范围是±1.7E+308
。但是不管这个范围有多大,有些小伙伴就想杠一下,如果我就要存一个比Integer或Long更大的数字,怎么办?
针对这种大整数的需求,我们可以使用BigInteger,它的数字范围比Integer类型的数字范围要大得多,而且BigInteger支持任意精度的整数。
也就是说在运算中,BigInteger类型可以准确地表示任何大小的整数值。BigInteger和Integer、Long一样都是Number的子类,属于不可变类。它自身带有一些可以进行运算的方法,包括基本的加、减、乘、除操作,还有很多较为高级的操作,像求绝对值、相反数、最大公约数及判断是否为质数等,所以BigInteger用起来是比较方便的。
2.使用方法
2.1常用API方法
如果我们要使用BigInteger类,首先要创建一个BigInteger对象。
BigInteger类提供了多个构造方法,其中最直接的一个是以字符串作为参数的构造方法,即BigInteger(Stringval)。在创建BigInteger对象之后,我们就可以调用BigInteger类提供的方法,进行各种数学运算了,这些常用的API方法如下:
方法名称 | 说明 |
---|---|
add(BigIntegerval) | 做加法运算 |
subtract(BigIntegerval) | 做减法运算 |
multiply(BigIntegerval) | 做乘法运算 |
divide(BigIntegerval) | 做除法运算 |
remainder(BigIntegerval) | 做取余数运算 |
divideAndRemainder(BigIntegerval) | 做除法运算,返回数组的第一个值为商,第二个值为余数 |
pow(intexponent) | 做参数的exponent次方运算 |
negate() | 取相反数 |
shiftLeft(intn) | 将数字左移n位,如果n为负数,则做右移操作 |
shiftRight(intn) | 将数字右移n位,如果n为负数,则做左移操作 |
and(BigIntegerval) | 做与运算 |
or(BigIntegerval) | 做或运算 |
compareTo(BigIntegerval) | 做数字的比较运算 |
equals(Objectobj) | 当参数obj是Biglnteger类型的数字并且数值相等时返回true,其他返回false |
min(BigIntegerval) | 返回较小的数值 |
max(BigIntegerval) | 返回较大的数值 |
2.2基本案例
我们先来通过一个案例,来验证一下BigInteger中的数字到底有多大。
public static void main(String[]args) {//创建一个BigInteger对象BigIntegerbi= new BigInteger("1234567890");//计算1234567890的15次方,//结果=23589821655914838120947036369147203948318169938519404175968425823418008249115809912616071588527110255905622789563711716349000000000000000System.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异常。我们来验证一下吧。
public static void main(String[]args) {//BigInteger转基本类型BigIntegerbi02= new BigInteger("123456789000");//123456789000System.out.println("转为int类型="+bi02.intValue()); System.out.println("转为float类型="+bi02.floatValue()); System.out.println("转为long类型="+bi02.longValue()); //将123456789000乘以123456789000,然后将结果转为long类型//java.lang.ArithmeticException:BigIntegeroutoflongrangeSystem.out.println("得到精确结果="+bi02.multiply(bi02).longValueExact()); }
但是如果BigInteger的值超过了float的最大范围(3.4x1038),结果并不会出现ArithmeticException异常,而是会出现Infinity,如下所示:
//计算999999的99次方,并得到该结果的float值BigIntegerbi03= new BigInteger("999999").pow(99);floatf=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) {Scannerscanner= new Scanner(System.in); System.out.println("请输入一个整数:"); //保存用户输入的数字 intnum=scanner.nextInt(); //使用输入的数字创建BigInteger对象 BigIntegerbi= 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(doubleval):实例化对象时可以将双精度型转换为BigDecimal类型;
●BigDecimal(Stringval):实例化对象时可以将字符串形式转换为BigDecimal类型。
2.2常用API方法
除了构造方法之外,BigDecimal还提供了一些常用的API方法供我们进行数学运算。这些方法与BigInteger的方法类型,很多方法名称和用法也都与之一致,所以这里壹哥就不再一一列出了,接下来我就直接通过一个案例给大家演示这些方法如何使用。
import java.math.BigDecimal;public class Demo11 {public static void main(String[]args) {BigDecimalbd= 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)));//获取小数的位数,5System.out.println(bd.scale()); //去掉BigDecimal末尾的0,返回一个与原有BigDecimal相等的新对象BigDecimalbd2=bd.stripTrailingZeros();System.out.println(bd2.scale()); }}
在上述代码中,stripTrailingZeros()方法用于去掉BigDecimal末尾的0,并返回一个与原有BigDecimal相等的新对象。而scale()方法用于获取一个数字后面0的个数,如果返回的是负数,比如-2,则表示该数是一个整数,且末尾有2个0。
2.3divide()除法
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) {BigDecimald1= new BigDecimal("123.456");BigDecimald2= new BigDecimal("123.456789");//会产生ArithmeticException异常,因为除不尽,可以设置RoundingMode,按照指定的方法进行四舍五入或者直接截断://BigDecimald3=d1.divide(d2);//保留10位小数并四舍五入BigDecimald4=d1.divide(d2, 10, RoundingMode.HALF_UP); System.out.println("d4="+d4);//按指定的位数直接截断,0.xxxxBigDecimald5=d1.divide(d2, 4, RoundingMode.DOWN); System.out.println("d5="+d5);}}
2.4divideAndRemainder()除法
而divideAndRemainder()方法,会返回一个数组,内部包含两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数,所以我们可以利用这个方法来判断两个BigDecimal是否是整数倍数。
import java.math.BigDecimal;import java.math.RoundingMode;public class Demo12 {public static void main(String[]args) {//divideAndRemainder方法,返回一个数组,该数组内部包含了两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数。//我们可以利用这个特性来判断两个BigDecimal是否是整数倍数。BigDecimaln= new BigDecimal("123.456"); BigDecimalm= 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) {BigDecimald1= new BigDecimal("123.456");BigDecimald2= new BigDecimal("123.456000");//false,因为scale不同System.out.println("d1==d2?"+d1.equals(d2)); //true,因为d2去除尾部0后scale变为2System.out.println("d1==d2?"+d1.equals(d2.stripTrailingZeros())); //结果=0,负数表示小于,正数表示大于,0表示等于System.out.println("d1==d2?"+d1.compareTo(d2));}}
之所以需要使用compareTo()方法来比较两个BigDecimal的值才准确,这是因为一个BigDecimal实际上由一个BigInteger和一个scale组合而成的,其中BigInteger表示一个完整的整数,scale表示小数位数。如下图所示:
compareTo()方法内部会对小数位数进行判断,所以更准确,如下图:
三.结语
至此,我们就把BigInteger、BigDecimal
等大数字类介绍完毕了,最后给大家总结一下今天的重点内容:
●BigInteger用于表示任意大小的整数;
●BigInteger是不变类,并且继承自Number;
●将BigInteger转换成基本类型时可使用longValueExact()等方法保证结果准确;
●BigDecimal用于表示精确的小数,常用于财务计算;
●比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals()。
关键词:
【天天速看料】Java基础学习之大数字处理相关的类有哪些?
将Windows系统设置NTP服务器-NetTime篇
金仓数据库字符串分割函数_天天速看料
深圳:港澳青年在深创业个人最高可贷60万元
苹果联合创始人炮轰马斯克自动驾驶画饼:想死就买特斯拉!
李佳琦面试75岁奶奶主播引围观:老人直呼为推广国货努力 这是国家自信
环球即时:调试器是个大骗子!
快速高效的C#FTP文件传输库FluentFTP|全球速讯
开心档之MySQL 导入数据-焦点报道
开封市通许县四所楼镇:让社情民意联络点当好民声传话筒|全球快讯
支持华为HMS服务!酷比魔方Pad 50Pro发布 首发899元
世界热点评!陌陌被苹果下架 官方回应:技术问题正解决 老用户不影响
这五一超20万人去淄博:鲁C变身网红旅游名城_快资讯
当前讯息:怎么看?老人欲插队被服务员严词拒绝:前有插队婆孙被网曝 还被做车贴很恶心
功能不成熟 马斯克推特直播秒变马赛克 网友吐槽:8-Bit埃隆_世界新要闻
今年全国快递业务量突破400亿件
常用的热门 API 汇总 环球热推荐
即时看!jasperreport开发手册--ireport教程
世界百事通!什么是EMR?为什么要以电子病历(EMR)为核心,建设医院信息集成平台?
安全验证必备——语音验证码短信 API 当前快看
火山引擎 DataTester 上线全新 MAB 智能调优实验
坎普斯boss怎么打_坎普斯怎么打_当前快讯
一机多用:劲能电钻/电动螺丝刀39元起(100元大额券) 每日速递
【天天热闻】向华为供货740万块硬盘 被重罚3亿美元!希捷:已和解并开始付罚金
当前观点:特斯拉公共充电桩功率仅23KW 比亚迪车主一度愧疚:把人家功率吸走了
又一五菱神车!宝骏悦也5月15日首发:车尾背个“大手表”
iPhone平均售价越来越高了!Pro和Pro Max最受果粉喜爱
当前短讯!浙江师范大学2023年硕士研究生复试录取办法
seventeen是哪个公司?seventeen在韩国是几线?seventeen有几个人?
冰淇淋和冰激凌区别是什么?明胶在冰淇淋中的作用是什么?
厨师的高帽子叫什么?为什么厨师要戴白色高帽子?
梦华录里的西京是哪里?梦华录是在哪些地方取景?
富士山在日本的哪里?富士山是私人的吗?富士山为什么是私人的?
boot priority是什么意思?boot priority怎么设置?
小米3s什么时候上市的?小米3s参数配置
百度网盘邀请码怎么使用?百度网盘邀请码大全
辽篮回沈阳!全员餐厅吃饭,张镇麟狂笑,莫兰德搞怪,回去仍加练-今亮点
centos7安装oracle11g11.2.0.4.0
【解决办法】三层交换机通过静态路由和接口互联,实现不同VLAN间通信的两种方法
ES全文检索,Neo4J,activiti审批流的知识库管理系统
thinkpad扩展坞接口怎么用?thinkpad的扩展坞有什么用?
移动磁盘无法写入文件怎么回事?移动磁盘无法写入文件怎么解决?
调查显示:电影“五一”档女性观众购票用户首次突破六成
699元 70迈4K旗舰行车记录仪A810发布:首发索尼IMX678_环球热头条
祝融号有重大发现:火星低纬度存在液态水
联想小新K3机械键盘发布:199元 91键小而全
天天头条:国内油价有望怒跌超3毛!基本抵消掉第八轮的微涨4毛
热血又感人!海外影迷评《长空之王》:5岁儿子非常喜欢
有景区免费发冰棍,有景区一盘炒鸡蛋48元——记者调查五一小长假山西景区旅游现状
当前关注:Zabbix“专家坐诊”第190期问答汇总
Linux IMX6ULL RTC掉电不保存问题解决|全球快报
苏宁零钱宝在哪里查看_苏宁零钱宝 环球看点
小记者手抄报 赛场小记者手抄报
放心买吧!最新研究:电动车电池比车本身更耐用|天天微资讯
真我11系列来了:2亿新影像 支持多焦段无损变焦
视点!小米13 Ultra全新限量定制色成了!雷军称特别多人喜欢 非常意外
赔钱卖车?福特汽车加入价格战 电动车利润率-102%
7人吃自助4小时炫300多个螃蟹 还有四五十盒榴莲等:网友直呼厉害_环球热讯
『徐州味·旅游季』料足滋味长 天天热头条
ios证书免费分享
滚动:【财经分析】清洁能源基础设施REITs发展空间广阔 应高度重视项目前期培育
天天快看:3699元起!联想小新mini主机上市:13代酷睿标压处理器加持
全球快报:全球多地出现罕见高温!厄尔尼诺或将带来全球变暖新高峰
秒杀安卓所有!苹果发财报:iPhone全球卖爆 营收历史新高 库克感谢国人|全球焦点
环球即时:演员张智霖在线求华为Mate X3息屏显示长开 华为李小龙回应
世界今热点:政策多管齐下撬动农村大市场
工银国际对美联储5月FOMC点评:加息“暂停” 降息“未定” 环球实时
【财经分析】欧洲央行最激进的货币紧缩周期将进入尾声_焦点信息
今热点:厂里不签合同还扣工资
欧盟警告苹果不准加密USB-C接口:必须兼容安卓数据线/充电器 否则禁售-快报
vivo X90S曝光:处理器升级为天玑9200+ 安卓最强芯-新要闻
男子误把每月汇款当捐款 4年收到24万竟是工资引热议:专家喊话薪酬透明化
世界看点:学系统集成项目管理工程师(中项)系列17b_范围管理(下)
淄博鸭头小哥直播中气到落泪:被女粉骚扰 1天18万人逛仅卖6千元-观察
当前关注:孝敬父母事迹(关于孝敬父母的名言)
【解决方法】调整CRT终端窗口的配色,透明度,标题栏内容,并自定义配色
销量火爆!AMD 12nm Zen+锐龙APU重出江湖:专供中国 热推荐
注意!一种藏在厨房的致癌物 很多人都忽略了 天天关注
给AI 100美元 让它去赚钱:结果真的“赚”大了 全球资讯
一款满足所有“X幻想”的App:消失4年 终于回来了_全球快看
天天速读:光荣使命ol进不去咋办_光荣使命ol进不去
支付宝转账被骗能追回_支付宝被骗了怎样能追回钱
贵州财经大学创新创业园:创业孵化助力青年创业“圆梦” 消息
重庆成立青年团员律师法律服务志愿队 将开展百场普法宣讲
环球新资讯:Exp6 MSF应用基础
环球微资讯!“世界上最难修的铁路”:青藏铁路将开行复兴号
西湖景区通报1500元打捞手机、日入一万:竟是自导自演-世界热点评
【全球聚看点】SK海力士中国工厂增产“落后”工艺:内存还要降价15%!
快资讯:日均充电车辆8700台次 湖南高速服务区护航“五一”绿色出行
cryptohack wp day(1)
关注特殊群体,市图书馆举办花园读书会活动_当前热闻
工资涨幅不到去年一半!三星员工威胁:或将发动历史性罢工-重点聚焦
暴雪游戏停服一百天:提交退款申请截至6月30日
世界观热点:Java 双指针项目中的实际应用
全球新动态:84.范围for
巴西媒体人:全球对美国货币政策不满与日俱增 美元国际吸引力大幅降低
热消息:【新华解读】2022年保险业风险可控 未来应提升自身“造血”能力
国产AI和ChatGPT的差距有多大?李彦宏:有可能能赶上 也有可能一直追不上 焦点资讯
为什么火锅里的金针菇叫“明天见”?了解一下几丁质 天天热头条
对标ChatGPT!李彦宏:文心一言已完成4次技术升级 大模型推理性能已提升近10倍