JAVA的int与float同为32位,为什么int转float会丢精度

本文探讨了32位的int转换为float时为何会丢失精度,详细解释了浮点数的存储结构,包括1位符号位、8位指数位和23位尾数。当int值超出约1677万时,由于float的有效存储位限制,会导致精度丢失。随着数值增大,指数位的使用使得精度损失加剧。文章通过实例说明了这种精度丢失的机制,并指出在特定业务场景下,若int值范围较小,转换为float可能不会造成显著影响。

我们知道int是4字节32位,float也是4字节32位。

那么为什么int转float会丢失精度呢?精度是怎么丢失的?

首先int的32位存储的2进制,每一个二进制代表一个固定数值,

范围是-2147483548~2147483547。

再看float

同样是32位,float有1位的符号位,8位的指数位,和23位的尾数。

所以float实际存储数据只有后23位是有效。

以2进制换算成整数,大约是正负(16777216)的整数范围是有效的(本文暂不考虑小数情况,小数比较特殊)。

所以超出约1千6百万的范围的int转float就会丢失精度。

(如果业务数据虽然是int类型,实际业务不会超出约1677万的值,那么可以无忧的直接转换成float)

精度是什么丢的?

还是以整数为例,23位只能存1千6百万,那么超出23位,例如2千万是怎么存储的呢?

这里用到了指数位。假设指数是0,那么就是正常存储约1600万以内的数值。

假设指数是1,代表虽然存的是23位二进制,实际后边还有1位,但是我不知道是0还是1。这里就会选择一个默认的值,默认最后是0,那么存的如果是例如16777217,二进制最后是1,那么再取出来也是16777216.因为最后一位没有存。

这样每2个数就会有一个丢失了精度。

这个范围大概会持续到约3300万。因为如果要存储25位数值,后边就要约掉2位二进制。

这时候,就是每4个数就有3个丢失精度。以此类推。

由此可知,虽然float精度会丢失,但是确定存储超出Int范围的数据,例如50亿,100亿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值