【发布时间】:2023-03-11 22:04:01
【问题描述】:
我使用 ReShaper,当我用 == 比较两个双精度值时,它建议我应该使用 Math.具有公差的 ABS 方法。见:https://www.jetbrains.com/help/resharper/2016.2/CompareOfFloatsByEqualityOperator.html
这个例子
double d = 0.0;
double d2 = 0.0;
if (d == d2)
{
/* some code */
}
然后转换为
double d = 0.0;
double d2 = 0.0;
if (Math.Abs(d - d2) < TOLERANCE)
{
/* some code */
}
但我认为,对于开发人员来说,考虑正确的容差确实很复杂。所以我认为这可能在 Double.Equals() 方法中实现。
但是这个方法是这样实现的
public override bool Equals(Object obj) {
if (!(obj is Double)) {
return false;
}
double temp = ((Double)obj).m_value;
// This code below is written this way for performance reasons i.e the != and == check is intentional.
if (temp == m_value) {
return true;
}
return IsNaN(temp) && IsNaN(m_value);
}
public bool Equals(Double obj)
{
if (obj == m_value) {
return true;
}
return IsNaN(obj) && IsNaN(m_value);
}
这是为什么呢?比较双精度值的正确方法是什么?
【问题讨论】:
-
为什么不使用十进制? if(double1
-
如果您发现 开发人员 难以获得容忍度,那么 .NET-framework 应该如何决定,因为它的容忍度要低得多知道你认为什么是平等的。
-
@HimBromBeere 我认为他们可能会使用 double.Epsilon 作为默认容差,或者这是一个坏主意?
-
它在您提供的文档中说,在大多数情况下,Epsilon 被认为太低而不能成为默认容差。
-
什么是比较双精度值的正确方法 - 没有办法 - 你不能检查
double的 real 相等性。在需要检查相等性的情况下不要使用double,而是使用decimal