10.数字类型包装类

本文讨论了Java编程中基本类型如Int的局限性,介绍了如何通过引用类型(如自定义IntObject类)和包装类(如Integer)解决歧义。还讲解了自动装箱拆箱、equals与==的区别,以及Math.random、UUID和BigDecimal在高精度计算中的重要性,特别是处理小数精确计算的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本类型的局限性

在一些特定的场合下,基本数据类型满足不了我们的对于一些事物的描述要求。例如汪隋开了一家新的牛肉粉店,需要记录前开业以来前7天的营业情况,可以用Int类型的数组 来表示

Int[]a = {536,585,256,259,0,-548,0}

这样表示没毛病,可能有些场合下,会有岐义,第五天和第七天这个0的意思 是表示开张了没赚钱,还是表示没开张呢,在这种情况下就无法满足我们的表示 要求

​ 这时,如果用引用类型来表示,会有更好的效果

创建一个类

class IntObject{
    Int value;
    public IntObject(Int value){
        this value = value;
    }
}

这时用自己创建的类开表示 开店营业的情况,表示 的更为清晰

IntObject []  a  = {,new IntObject(536); new IntObject(585); new IntObject(256); new IntObject(259); new IntObject(0); new IntObject(536); null; }

因为引用类型有null,可以很好的表示 第七天没有开店,这就是自己定义的包装类

包装类

在jdk中,有官方写好的包装类,我们可以直接拿来用,对应的包装类

image-20211119170817397

Integer.valueof,不是直接调用 new integer(),而是如果 数字 在[-127,128]之间会缓存这个数字 然后再调用时直接返回缓存的,可能是jdk中认为这些数字 比较常用,所以设置了一个缓存,不必每次用数字 都去堆内存中去创建

image-20211119174118146

image-20211119174141686

自动装拆箱

在很多情况下,我们可以看到基本类型的引用类型的包装类可以互相使用,不需要我们操作什么,这其实是编译器为我们隐式的转换了

装箱

Integer类中有一个方法 valueOf方法, 这个方法返回的是 这是将数字转为引用类型

return new Integer(Int i);

image-20211119174538435

拆箱

Intvalue方法,

image-20211119174607729

编译器默认会为我们调用转换,我们也可以主动的调用

Integer a = 1;

image-20211119174556224

== ,equals的区别

== 用在基本类型比较的是值是否相等 用在引用类型比较的是地址址是否相等

equals只能用在引用类型中间,不能用在基本类型之间,equal是OBj类的一个方法

这个方法 最终调用的是 返回的是 (Object == anObject )也是比较这两个对象的地址值

现在有个需求就是字符串类型可以轻松的调用 equals方法来判断两个字符串值是否一样,如果是一样就返回true,不一样返回false,

好了,那String类型不重写这个方法,就算调用 了这个equalS方法 ,就算两个 一样的字符串调用这个父类的equlas方法 返回的可能 也是false, 因为两个 一样的字符串字面量一样,但是内存地址 可能会不一样,eg String a = "你好“ String b = new String (“你好”);这两个字符串类型,一个是存在scp学量迟中, 一个是 存储在堆内中, 所以可能 会不一样,那么 返回 的便是false,而我们的需求 是一样就返回true,而父类的默认比较又是地址 ,所以 我们要装将父类的默认规则改变下,要重写 equals方法 , 将其重写为只要字符 的值 一样就返回 true

image-20211119173953967

重写 后的equals方法

Math类

Math类,Math.random可以生成[0,1]中的随机数,

java.util.lang类中还有个有个Random类可以生成各种随机数

new Random(100)  表示生成0-100之间的随机数

UUID

UUID是通用唯一标识 符,我们可以适用于大型分布式系统 中,是java.util.UUID.类中的,randomUUID方法生成了一个128bit,32位进制的数

image-20211119174802292

DecimalFormat

image-20211119174818902

字符串(引用类型)转数字

image-20211119174900786

image-20211123195137216

数字转字符串

image-20211119175014773

金额运算为什么用bigDecimal计算机中小数怎么转二进制

小数之间的计算

Float f  = 1.5
Float b  =  0.7

此时如果需要得到两者相乘的结果,是不准确的

小数之间的计算如果想要得到准确无误的值,是需要用Java的一个类开BigDecimal来计算的

因为Java在基本数据类型的小数二进制保存的都是近似值,

比如

0.7
0.7*2=0.14
0.1*2=0.2
0.2*2=0.4
0.4*2=0.8
0.8*2=0.16
0.1*2=0.2
0.2*2=0.4
0.4*2=0.8
0.8*2=0.16
0.1*2=0.2
0.2*2=0.4

0.7的二进制为0.124812481248…

无限循环

Float类型是4个字节的,我们将无限循环的数存入4 个字节中,肯定是存不下的,所以会取其的近似值

如果相乘,本来就是不准确的数相乘,得到的结果一定是不准确

所以我们Java中有个类BigDecimal来计算高精度的计算

new BigDecimal(“数字”)来计算

那么bigde怎样计算使得没有误差呢,其中的原理是bigde是将字符串进行相乘,然后再相加,不会像其他类型将小数的二进制 进行运算(误差的值 运算得到的值 一定也是误差的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值