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

被折叠的 条评论
为什么被折叠?



