【java】为什么浮点数不能精确表示?

我们知道,在编写程序时,两个浮点数(float或double)不能直接进行大小比较。
当然,我们也都知道,不能直接进行大小比较的原因是因为浮点数在计算机内部不能精确的表示。可是,为什么在计算机内部浮点数不能够精确地表示呢?

这还得从IEEE 754标准说起。

根据IEEE 754标准,浮点数在计算机内部存储时主要分为符号位(sign)、指数(exponent)部分、尾数(fraction)部分:
在这里插入图片描述
那么,这个数就是:
在这里插入图片描述
例如十进制的0.5可以表示成
−1)0×2−1×1.0(−1)0×2−1×1.0 。
以32位的单精度浮点数(常见的float)为例,它的符号位占一位(bit),指数部分占8位,尾数部分占23位。

现在我们需要存储十进制的0.1这个小数,首先需要把0.1转换成二进制数。然而,我们会发现,十进制的0.1转换成二进制是一个无限循环小数:0.0001100110011001100…

可是,尾数只有23位,只能截取二进制小数的前23位存储。这时,误差就产生了。

当再次把这个浮点数转换成十进制数时,由于损失了一些二进制位,转换回来的十进制数自然也就与原来的不同了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值