Проблема с.equals при сравнении double в С#

У меня есть значение с плавающей точкой, которое я проанализировал в двойное число позже, округленное до 2. Также у меня есть другое значение float, которое я сделал точно так же, как и первый. Вот пример кода..

string pulse = arrvaluedline[2].ToString();
pCost = float.Parse(arrvaluedline[3]);

****** d = System.Convert.********(spCost);

****** dd = Math.Round(d,2);

string[] arrpulse = pulse.Split(':');

vodanoofPulse = float.Parse(arrpulse[0]);

calculatedCost = CallCost * Pulse;

****** dcalcost = Math.Round(calculatedCost, 2);

Теперь я пытаюсь сравнить

if (dcalcost.Equals(spCost)){
 }

Хотя мои оба значения dcalcost и spCost равны 0.4 Кроме этого, поток не идет внутри if.. Почему... Пожалуйста, помогите мне.

1 ответ

Метод Equals следует использовать с осторожностью, поскольку два явно эквивалентных значения могут быть неравными из-за различной точности этих двух значений. В следующем примере .333333 что двойное значение .333333 и двойное значение, возвращаемое путем деления 1 by 3 являются неравными.

// Initialize two ******* with apparently identical values 
****** ******1 = .33333;
****** ******2 = 1/3;
// Compare them for equality
Console.WriteLine(******1.Equals(******2)); // displays false

Сравнение двойников не так просто, как можно было бы подумать. Вот пример из MSDN о том, как вы можете сделать это лучше.

// Initialize two ******* with apparently identical values 
****** ******1 = .333333;
****** ******2 = (******) 1/3;
// Define the tolerance for variation in their values 
****** difference = Math.Abs(******1 * .00001);

if (Math.Abs(******1 - ******2) <= difference)
 Console.WriteLine("******1 and ******2 are equal.");
else
 Console.WriteLine("******1 and ******2 are unequal.");

licensed under cc by-sa 3.0 with attribution.