其他提示

从MSDN项 一倍。等于:

精确的比较

等方法的应用与 谨慎,因为两个显然 等价值可以不等于 不同精度两个 值。以下的示例报告 双值.3333和 双返回通过分割1 3 不平等的。

...

而不是比较为平等, 一个建议涉及的技术 确定一个可以接受保证金的 差之间的两个价值观(例如 .01%的一个值)。如果的 绝对值差异 两者之间值为小于或 平等的保证金,差异 很可能是由于差异 精密的,因此,值 很可能是平等的。下 如使用这种技术的比较 .33333和1/3,这两个双值 前面的代码如发现 可以不等。

如果你需要做很多的"平等"的比较,这可能是一个很好的想法写一个小帮手的功能或扩展的方法。净3.5比较:

public static bool AlmostEquals(this double double1, double double2, double precision)
{
    return (Math.Abs(double1 - double2) <= precision);
}

这可以用以下方式:

double d1 = 1.000001;

double d2 = 0.000001;

bool equals = (d1 - d2).AlmostEquals(1.0, 0.0000001);

看看这个非常类似的问题: C#.NET:它是安全检查浮点值平等对0?

这是因为在计算机基座2做数学,并且因此许多十进制浮点数字不能与数字的有限数量的准确表示。

如果您在应用程序中做这样的算术,对的 decimal 类型应使用

decimal d1 = 1.000001M;

decimal d2 = 0.000001M;

Console.WriteLine((d1 - d2) == 1.0M); // evaluates as true

这可能是由于浮点精度的问题,因为它可能是你的结果是不完全的1.0,但也许像1.000000000001

这是因为浮点类型存储使用碱两个不是基10所表示的数字。这有一倍无法存储像0.1的值准确的结果。例如0.1是由单一值0.100000001490116119384765625表示。

您已经使用十进制摆脱错误的。

这是由于方式浮点人数工作在CPU,它不C#具体。看看 维基百科条和纸张 在这里, 更多的信息。

简短的回答是,浮点数并不存作为一个确切的表示,这样做比较采用"=="不在你的方式试图使用它。

请参阅什么python文档具有saym的问题是针对两个相同的:

http://docs.python.org/tutorial/floatingpoint.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top