【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位存储。这时,误差就产生了。

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

猜你喜欢

转载自blog.csdn.net/Mr_zhang66/article/details/107835782
今日推荐