java float精度丢失_java float浮点型数据存储,丢失精度问题

java中float类型为4字节32位,内存中的存储遵循IEEE-754格式标准:

一个浮点数有2部分组成:底数m和指数e

底数m部分:使用二进制数来表示此浮点数的实际值。

指数e部分:占用8bit(1个字节)的二进制数,可表示数值范围为0-255。

但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。

所以,float类型的指数可从-126到128。

底数部分实际是占用24bit(3个字节)的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit。

所以一个浮点数的32位由三个部分组成:

1.第一位为符号位,表示改浮点数是一个正数还是负数,0为正,1为负;

2.第二到第九位共8为表示指数e,转成二进制需要+127(反之减去127);

3.后23位为底数,但是存储时自动省去了最高位的1,所以存储为23位实际为24位。(小数位置即为2^(23)=8388608       7位数  计算为6位数的精度)

举个栗子: 3.2f

转化为二进制存储:整数部分3  二进制  11

小数部分0.2  转化为二进制(乘2取整数部分直至小数部分为零) ---->(小数乘2)   0.4  0.8  1.6  1.2  0.4  0.8   1.6   1.2  0.4 ...... (无限循环)

结果为:11.00 1100 11001100 11001100 11001100(由于位数有限,而小数部分无限循坏,这里已经丢失了精度)

右移直到左边只剩一位 :1.100 1100 11001100 11001100 11001100 (右移了一位,可得到指数部分为1+127=128   1000 0000)

最后得到二进制的存储 : 0 100 0000 0100 1100 11001100 11001100 (丢失精度)

反之转化为浮点数十进制:符号位0 :正数

指数 100 0000 0 即为128减去127 指数为1

尾数部分:最高位1默认省去了加上小数点即为 1.100 1100 11001100 11001100

正指数右移一位  11.0011 00110011 0011001100

正数部分11---->3   底数部分   2^(-3)+2^(-4)+2^(-7)+2^(-8)+2^(-11)+2^(-12)+2^(-15)+2^(-16)+2^(-19)+2^(-20)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值