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

C# 为什么0.1*10-1不等于0?,c#,floating-point,C#,Floating Point,可能重复: 为什么0.1f*10f-1f最终成为1.490116E-08(0.0000001490116)?简单,近似值累积 见。浮点/双精度/十进制是相对精度类型。并非所有的值(其中有无限多个)都可以准确存储。您正在看到这种精度损失的结果。这就是为什么使用|a-b |

可能重复:


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

简单,近似值累积

见。浮点/双精度/十进制是相对精度类型。并非所有的值(其中有无限多个)都可以准确存储。您正在看到这种精度损失的结果。这就是为什么使用
|a-b |
进行浮点比较几乎总是正确的原因。

因为浮点运算不精确,请看这里:


部分
非整数的一些其他计算机表示法
。0.1不能在基2中有限地表示。

请看。

0.5可以用浮点精确地表示,这就是0.5*2=1的原因


但是,0.1不可精确表示,因此0.1*10不可精确表示为1。

阅读此内容(非常准确地解释了这种情况):

请参见:请参见[C#中的浮点运算为何不精确?]()。由于重复标志,我无法给出答案,但原因实际上是C#使用了中间精度。看见
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