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