C# У меня подсчитываются в коде два числа, типа double, они равны, но if их считает разными
C#. У меня подсчитываются в коде два числа, типа double, точность уже проверял, все выводил, они совершенно идентичны, но if их считает разными. То есть у меня все числа типа double, я выводил их типы. На экран выводятся 2,400000000 2,400000000. В if они сказочным образом оказываются не равны... Как это происходит?
Ответы (1 шт):
Во первых, то, что два 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-значением, и возникает интуитивное ощущение, что они должны быть равны. Но это не так.