为什么0.2(基数10)不能用二进制表示为0.10(基数2)

时间:2016-07-12 18:12:25

标签: java binary floating-point

我一直在阅读java中的浮点类型,例如double。 我也一直在阅读有关将分数转换为二进制以及如何执行此操作的内容。 我可以做数学运算,发现二进制表示0.2是以下近似值:

0.00110011001100...

然而,二进制中的2是10。 那么为什么我不能说0.2(基数10)相当于0.10(基数2)?

我读过类似的question,但我仍然对此感到困惑

另一个例子是5.8

101.110011001100...

为什么我们不能这样做:101.1000因为二进制中的8是1000

据我所知,0.10和0.1000是相同的,但在这种情况下它们将是分开的。

2 个答案:

答案 0 :(得分:2)

因为这与不同基础中的数字表示的工作方式不一致:

如果您有二进制数字,请说1100.101它用 base 2 表示,所以为了将其转换为10,您需要执行以下操作:

... 2^3   2²   2^1  2^0  .  2^-1   2^-2   2^-3 ...
    1     1    0    0    .  1      0      1

表示您拥有2^3 + 2² + 2^-1 + 2^-3 = the number in base 10

注意指数总是从左到右依次减少一个。所以基本上,当你向右移动一位数时,你要用你的基数除以2

这是数字在任何给定基数 B 中的表示方式。对于 B ,您有

... B^3   B²   B^1  B^0  .  B^-1   B^-2   B^-3 ...

对于您的示例,它意味着:

0.2 = 2 * 10^-1   //base 10 (= 0.2 in base 10)
0.2 = 2 * 2^-1    //base 2
0.1 = 1 * 10^-1   //base 10
0.1 = 1 * 2^-1    //base 2  (= 0.5 in base 10)

这就是为什么基数10中的0.2 且基数2不能为0.1的原因。

你甚至自己也说0.100.1000在你的代表中会有不同的数字。 (这不仅没有任何意义,但它对任何计算机来说都是一场噩梦

答案 1 :(得分:0)

出于同样的原因,1/3是基数10中的非终止小数,0.2或1/5在基数2中是非终止的。请注意,二进制数的小数部分与基数相同在图10中,基础10中的0.1是10 ^ -1,基础2中的0.1是2 ^ -1,或0.5。类似地,碱2中的0.01是1/4,0.001是1/8。因为两个幂的有限和不能等于它们的分母中不是2的幂的分数,所以这些数字是非终止的。在实际应用中,这可能会导致浮点运算问题,由于舍入而产生意外结果。出于这个原因,浮点数的相等测试最好在误差范围内完成,如0.01%。

另请参阅:Is floating point math broken?