Java int转float 精度损失

int n = 123456789;
float f =n;

打印f,发现f=1.23456792E8,发生了精度损失。
我起初的疑问,float取值范围比int取值范围大,为什么会出现精度损失那?
这里主要还是int和float底层的存储结构不同导致的。
int使用31位表示精度,float底层有23位来表示尾数,8位表示阶数。
这里精度主要是由这23位尾数来决定的(当指数位全部为0时省略的是0否则省略的是1;尾数23位加上省略的1位,float的精确度有24位。),8位阶数主要用来控制浮点数的大小。
如果int的范围超过了2^24,那么转换成float就会损失精度。
我们运用IEEE754标准来将123456789转换成单精度浮点数,来看一下精度是如何丢失的。

123456789 = 0x111010110111100110100010101 = 1.11010110111100110100010101 X 2^26
指数E=26+127=0x01111001
最终结果:0 10011001 11010110111100110100011 即123456792
精度损失,丢了3位。注意(这里最后3位101被丢掉了,但是进行了舍入处理,所以最终结果中的最后一位从0变成了1)

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值