0

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

  • Пожалуйста, уточните вашу конкретную проблему или приведите более подробную информацию о том, что именно вам нужно. В текущем виде сложно понять, что именно вы спрашиваете. – Дух сообщества Feb 27 '22 at 14:52

1 Answers1

0

Во первых, то, что два 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-значением, и возникает интуитивное ощущение, что они должны быть равны. Но это не так.

S.H.
  • 11,065
  • 1
  • 24
  • 46
  • Благодарю, я так и сделал, добавил сравнение с учетом некоторого eps. Теперь все работает. У меня возник вопрос, просто из любопытства. Можете привести пример, если не сложно, я не совсем понимаю, как это: "Вполне возможно, что Ваш код написан с использованием объектов, и Вы на самом деле, сами того не подозревая, сравниваете не величины, а равенство ссылок на объекты. Но про это, не посмотрев на Ваш код, тяжело сказать."? Ну то есть, у меня вот есть класс, я создал объект от него, вызываю у объекта геттеры и с ними арифметические операции выполняю, по идее должно быть все хорошо. – Angedon Feb 27 '22 at 15:14
  • я написал очень простой пример в ответе, если нужно придумать более хитрый пример - дайте знать... правда, с первой попытки в голову ничего не пришло – S.H. Feb 27 '22 at 15:24