C# У меня подсчитываются в коде два числа, типа double, они равны, но if их считает разными

C#. У меня подсчитываются в коде два числа, типа double, точность уже проверял, все выводил, они совершенно идентичны, но if их считает разными. То есть у меня все числа типа double, я выводил их типы. На экран выводятся 2,400000000 2,400000000. В if они сказочным образом оказываются не равны... Как это происходит?


Ответы (1 шт):

Автор решения: S.H.

Во первых, то, что два double обинаково выводятся на экран - не означает, что они равны. Они могут отличаться на очень маленькую величину. Это простой эксперимет, проверьте код типа

    double a = x1;
    double b = x2; 
    double eps = (a-b) * 1000000;
    Console.WrileLine( $"eps = {eps}" );

подставтьте в код два Ваших числа вместо x1 и x2. Если они различные - весьма вероятно, что eps будет отличен от нуля

Во вторых, "равенство" в C# работает чуть чуть сложнее, чем просто сравнение величин. По умолчанию при сравнении ref - объектов используется эквивалентность ссылок.

Вполне возможно, что Ваш код написан с использованием объектов, и Вы на самом деле, сами того не подозревая, сравниваете не величины, а равенство ссылок на объекты. Но про это, не посмотрев на Ваш код, тяжело сказать.

Автор вопроса в комментарии попросил привести пример.

Вот "глупый пример": здесь ошибка находится на поверхности:

    using System;

    namespace DummyExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyClass a = new(42);
                MyClass b = new(42);
                Console.WriteLine($" a==b? : {a==b} ");
            }
        }

        class MyClass{
            private int val;
            public MyClass(int x){
                val = x;
            }
        } 
    }

Здесь два объекта инициализируются одинаковым int-значением, и возникает интуитивное ощущение, что они должны быть равны. Но это не так.

→ Ссылка