我正在使用 C# 中的十进制值,并且遇到了精确比较两个十进制值的需要。为此,我考虑了两种主要的比较方法:使用 Decimal.Compare 和相等 (==) 运算符。 我想澄清一下 Decimal.Compare 方法和 == 运算符在比较两个十进制值时是否提供相同级别的精度。我很好奇在什么情况下这两种比较方法的结果可能会有所不同。
我尝试过的: 我尝试使用以下示例代码来比较两个十进制值:
decimal value1 = 0.1m;
decimal value2 = 0.10m;
int compareResult = Decimal.Compare(value1, value2);
bool isEqualUsingCompare = (compareResult == 0);
bool isEqualUsingEqualityOperator = (value1 == value2);
在上面的代码中,使用 Decimal.Compare 和 == 运算符似乎表明 value1 和 value2 相等。
我的期待: 我希望了解上述两种方法在所有情况下是否始终可靠,特别是如果存在任何边缘情况,使用这两种方法进行比较的结果可能会有所不同。
您可以查看Decimal struct的参考源。在第 381 - 389 行,您可以看到:
// Compares two Decimal values, returning an integer that indicates their
// relationship.
//
[System.Security.SecuritySafeCritical] // auto-generated
[ResourceExposure(ResourceScope.None)]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static int Compare(Decimal d1, Decimal d2) {
return FCallCompare(ref d1, ref d2);
}
第 457 - 461 行:
[System.Security.SecuritySafeCritical] // auto-generated
public bool Equals(Decimal value)
{
return FCallCompare(ref this, ref value) == 0;
}
第 1162 - 1165 行:
[System.Security.SecuritySafeCritical] // auto-generated
public static bool operator ==(Decimal d1, Decimal d2) {
return FCallCompare(ref d1, ref d2) == 0;
}
即,
Decimal.Compare
、Decimal.Equals
、运算符==
以及此处未显示的所有其他比较运算符都依赖于相同的方法FCallCompare
,因此它们都返回一致的结果。