java中int型转float型的精度丢失

int转float必然会导致精度丢失,int型是32位,float型也是32位,但是float是由1位符号位+8位指数位+23位小数位组成。

所以float只能有效表示24位以内的int型数据(float有一位省略的整数位)当int型是24位以上的时候,多余的位就会被舍去。

上面的内容是从网上看到的,事实也是如此,但是自己测试的时候发现int型的多余位数并不是被简单的直接抹去,有的时候转成float型会变大,有时候会变小,通过百度发现float的舍入规则这个东西。

IEEE754标准中,舍入处理提供了四种可选方法:

就近舍入其实质就是通常所说的"四舍五入"。例如,尾数超出规定的23位的多余位数字是10010,多余位的值超过规定的最低有效位值的一半,故最低有效位应增1。若多余的5位 是01111,则简单的截尾即可。对多余的5位10000这种特殊情况:若最低有效位现为0,则截 尾;若最低有效位现为1,则向上进一位使其变为 0。(java中采用就近舍入)

朝0舍入 即朝数轴原点方向舍入,就是简单的截尾。无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。这种方法容易导致误差积累。

朝+舍入 对正数来说,只要多余位不全为0则向最低有效位进1;对负数来说则是简单的截尾。

朝-∞舍入 处理方法正好与 朝+∞舍入情况相反。对正数来说,只要多余位不全为0则简单截尾;对负数来说,向最低有效位进1。

 

在java中使用的是就近舍入这种方式,比如‭1 1111 1111 1111 1111 1111 0011‬这个int数有25位,在转float的时候前24位有效,末尾是1,相当于是多余尾数是10000,就看最低有效尾数是1,就向上进一位。变成‭1 1111 1111 1111 1111 1111 010。

如果是‭1 1111 1111 1111 1111 1111 00101这样,多余尾数相当于是10000,最低有效尾数是0,就直接舍去多余尾数变成‭1 1111 1111 1111 1111 1111 0010。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值