关于c#:为什么0.1 * 10-1不等于0?

Why is 0.1*10-1 not equal is 0?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why is floating point arithmetic in C# imprecise?

1
2
3
4
5
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-08(0.0000001490116)?


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


请阅读(非常准确地解释这种情况):http://www.exploringbinary.com/the-answer-is-one-until-you-use-floating-point/


看看每个计算机科学家都应该知道什么是浮点运算。


由于浮动操作不精确,请看以下内容:

  • http://en.wikipedia.org/wiki/浮点数

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


0.5可以精确地用浮点表示,这就是为什么0.5*2=1精确。

但是,0.1不能精确地表示,因此0.1*10不是1。


简单,近似值累积。