Пример кода:
double afterRoundBalance, beforeRoundBalance;
…
if (afterRoundBalance – 4.78 != beforeRoundBalance)
{
Report.Failure(“…”);
}
В результате даже если логически сравнение внутри if должно выдавать true, иногда попадаем в Report.Failure.
Это связано с тем, что тип double – тип данных с плавающей точкой. Такие значения хранятся в памяти компьютера в виде используя степени числа 2. То есть число 0.1 будет хранится в памяти компьютера как 0.000110011001100, так как 0,1 примерно равно 0*20+0*2-1+0*2-2+0*2-3 +1*2-4 +1*2-5 +0*2-6 +0*2-7 +1*2-8 +1*2-9 +0*2-10 +0*2-11 +1*2-12 +1*2-13
Тем не менее оно не равно абсолютно десятичному 0,1, и сравнение с ним не даст положительного результата, так как десятичный результат будет 0,0999755859375.
Поэтому для подобных вычислений где нужно сравнение точности значений со знаками после запятой нужно использовать decimal.