3

执行以下代码时:

public class FPoint {
    public static void main(String[] args) {
        float f = 0.1f;
        for(int i = 0; i<9; i++) {
            f += 0.1f;
        }
        System.out.println(f);
    }
}

显示以下输出:

1.0000001

但输出应该是1.0000000,对吧?如我错了请纠正我..!!

4

4 回答 4

8

对于 IEEE 754 标准,0.1 并不是真正的“0.1”。

0.1 被编码:(0 01111011 10011001100110011001101带有浮点数)

  • 0 是符号(= 正)
  • 01111011 指数 (= 123 -> 123 - 127 = -4 (127 是 IEEE 754 中的偏差))
  • 10011001100110011001101尾数

要将尾数转换为十进制数,我们有 1.10011001100110011001101*2^ -4 (base2) [1.xxx 在 IEEE 754 中是隐含的]

= 0.000110011001100110011001101(base2)

= 1/2^4 + 1/2^5 + 1/2^8 + 1/2^9 + 1/2^12 + 1/2^13 + 1/2^16 + 1/2^17 + 1 /2^20 + 1/2^21 + 1/2^24 + 1/2^25 + 1/2^27 (base10)

= 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192 + 1/65536 + 1/131072 ...(base10)

= 0.10000000149011612 (base10)

于 2013-09-30T07:18:41.413 回答
4

就像某些实数(例如 1/3)不能在我们的十进制系统中准确表示,某些数字(例如 1/10)不能准确地用二进制表示。

1/3=(decimal)0.33333333333 (3) recurring  
1/10=(binary)0.00011001100 (1100) recurring 

因为我们对十进制非常熟悉,所以 1/3 显然无法精确表示,但对于以 3 为底的数字系统的人来说,这似乎是对十进制的主要限制;

1/3=(base 3)0.1

因此,浮点数中的 1/10 表示不精确,通过将多个不精确的数字相加,您会得到不精确的答案。

正是在这种情况下,您应该解释浮点错误。如果您有一个可以在十进制中精确表示但不能在二进制中表示的数字,那么您可能会发现BigDecimal很有用。但是你不应该认为 BigDecimal 比浮点数更好;它只是有一组不同的数字,它可以并且不能准确地表示;你习惯的那一套。BigDecimal 还尝试在二进制处理器上使用十进制计数系统。因此,它的计算效率低于基于双/浮点数的计算

于 2013-09-30T08:18:38.517 回答
0

如果您需要精确计算,例如在处理非常敏感的数据时,请不要使用floator double,它们在二进制中的表示使用近似值。查看这篇文章以获得一些很好的解释。

于 2013-09-30T06:55:37.163 回答
-1

这是一个常见的误解。这种“错误”与浮点数据结构有关:阅读. 在这种情况下,您可以使用 adouble来获得更高的精度。

于 2013-09-30T06:52:33.233 回答