2010-11-25 144 views
0

可能重复:
Why is floating point arithmetic in C# imprecise?为什么0.1 * 10-1不等于0?

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)?

+5

参见:“为什么不能十进制数是用二进制表示吗?“](http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-represented-exactly-in-binary) – 2010-11-25 00:41:07

回答

4

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

0

简单,近似值积累。

0

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

然而,0.1是不能表示完全是,所以0.1 * 10是不完全的1

相关问题