为什么0.1 * 10-1不等于0?

时间:2010-11-25 00:37:56

标签: c# floating-point

  

可能重复:
  Why is floating point arithmetic in C# imprecise?

Console.WriteLine(0.5f * 2f);       // 1
Console.WriteLine(0.5f * 2f - 1f);  // 0

Console.WriteLine(0.1f * 10f);      // 1
Console.WriteLine(0.1f * 10f - 1f); // 1.490116E-08

为什么0.1f * 10f - 1f最终成为1.490116E-080.0000001490116)?

6 个答案:

答案 0 :(得分:4)

Wiki: Floating Point。 float / double / decimal是相对精度类型。并非所有值(其中有无限多个)都可以精确存储。您看到了这种精度损失的结果。这就是为什么使用|a - b| < small_delta进行浮点比较几乎总是正确的。

答案 1 :(得分:1)

由于浮动操作不精确,请看一下:

部分Some other computer representations for non-integral numbers。 0.1不能在基数2中有限地表示。

答案 2 :(得分:1)

答案 3 :(得分:1)

答案 4 :(得分:0)

简单,近似积累。

答案 5 :(得分:0)

0.5完全可以浮点表示,这就是0.5 * 2 = 1的原因。

然而,0.1无法准确表示,因此0.1 * 10不完全是1。