我使用ReShaper,当我将两个double值与==进行比较时,它表明我应该使用数学。具有公差的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);
}
为什么?比较双值的正确方法是什么?
答案 0 :(得分:4)
您可以创建扩展方法
doubleValue.AlmostEqualTo(doubleValue2)
并像这样使用
#pa_buy-sell[]
答案 1 :(得分:0)
我最终使用了
double piConstant = 3.142;
double piFractional = 7/22;
if(piConstatnt.String("{0:0.00}")==piFractional.String("{0:0.00}")
{
// some code
}
这让我可以通过设置所需的字符串格式来控制精度。 https://www.csharp-examples.net/string-format-double/
如果您想了解有关 Microsoft 的 Equals 方法的更多信息。 https://docs.microsoft.com/en-us/dotnet/api/system.double.equals?view=net-5.0