为什么大部分小数在计算机中是不精确的

Java在处理小数运算时可能会遇到精度丢失问题,这源于浮点数在内存中的存储方式,包括符号位、指数位和尾数位。小数转换为二进制的无限循环特性导致计算机无法精确表示,从而影响运算结果的精确度。例如,1.2+1.4不等于2.6的现象就与此有关。
摘要由CSDN通过智能技术生成

java中小数运算常常会出现这种丢失精度的问题

如1.2+1.4结果应该是2.6但打印结果却并非2.6

 

1.首先java中小数的存储方式:

java中浮点数存储方式分三部分即 符号位、指数位、尾数位。

例如folat占四个字节:那么总共就是32位、符号位占1位、指数占8位、尾数位就是23位;

2.而计算中所有数据在进行运算存储都需要转换成二进制的形式进行;

再来看看小数的十进制转二进制步骤:

(1):小数部分乘2得到积数;

(2):如果积大于0则取二进制中的1如果积小于0则取二进制中的0;

(3):如果积大于1就把积的整数部分取除,继续乘2得到一个积 重复步骤2 以此循环直到结果位整数。

例如图中得 浮点数1.2转换位2进制:

整数部分:0001;

 小数部分:0.2 x 2 = 0.4 0.4x2= 0.8 0.8x2 = 1.6   0.6x2 = 1.2  0.2x2 = 0.4   0.4x2=0.8...................

                            0                  0                  1                   1                   0                   0     .................

       结果就是0001.0011001100................

因此小数部分无限循环导致计算机无法精确显示。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值