Java基本类型转换

文章讨论了Java中整数可以自动转换为byte或short,但浮点数从double转为float需要显式标识的原因。这是因为浮点数在二进制表示中可能存在精度损失,自动转换可能导致不可预知的结果,因此Java设计时不支持这种自动转换。
摘要由CSDN通过智能技术生成

简单的类型自动转换和强转这里就不说了,这里就说一个大类型向小类型自动转换的问题.

常识:

对于整型,Jvm虚拟机默认为int类型。

对于浮点型,Jvm虚拟机默认为double类型;

自动转换 - 将较小的类型转换为较大的类型byte-> short-> char-> int-> long-> float->double

手动转换 - 将较大的类型转换为较小的类型double-> float-> long-> int-> char-> short->byte

这时就有一个问题,整数默认是int类型,那么为何可以将整数直接赋值给byte/short,当然前提是整数在byte/short的取值范围内,答案是jvm在底层自动进行了转换

那么这就引申出了另一个问题,浮点数默认是double类型,为何不能将浮点数直接复制给float变量,

而必须用F/f指明是float浮点数才可以,也就是说jvm为何不会自动将double转化为float,就像自动将int转化为byte/short一样

答案:

计算机并不能识别除了二进制数据以外的任何数据。无论我们使用何种编程语言,在何种编译环境下工作,都要先 把源程序翻译成二进制的机器码后才能被计算机识别。以上面提到的情况为例,我们源程序里的2.4是十进制的,计算机不能直接识别,要先编译成二进制。但问 题来了,2.4的二进制表示并非是精确的2.4,反而最为接近的二进制表示是2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数,这点如果知道怎样进行浮点数的二进制与十进制转换,应该是不难理解的。如果在这个转换的过程中,浮点数参与了计算,那么转换的过程就会变得不可预 知,并且变得不可逆。我们有理由相信,就是在这个过程中,发生了精度的丢失。而至于为什么有些浮点计算会得到准确的结果,应该也是碰巧那个计算的二进制与 十进制之间能够准确转换。而当输出单个浮点型数据的时候,可以正确输出;

在系统中使用的数字一般都是十进制,但计算机只能将其转化为二进制进行识别,那么问题来了,许多十进制浮点数是无法精确的转化为二进制数的,只能转化为最接近的二进制,那么jvm将double自动转化为float时就会直接造成精度丢失,这在程序设计中是不被允许的.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值