Сравнение равных значений в C# не даёт положительного результата (с#)

Пример кода:

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.

About

Leave a Reply

Your email address will not be published. Required fields are marked *