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
)?
答案 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。