C#. У меня подсчитываются в коде два числа, типа double, точность уже проверял, все выводил, они совершенно идентичны, но if их считает разными. То есть у меня все числа типа double, я выводил их типы. На экран выводятся 2,400000000 2,400000000. В if они сказочным образом оказываются не равны... Как это происходит?
1 Answers
Во первых, то, что два 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-значением, и возникает интуитивное ощущение, что они должны быть равны. Но это не так.
- 11,065
- 1
- 24
- 46
-
Благодарю, я так и сделал, добавил сравнение с учетом некоторого eps. Теперь все работает. У меня возник вопрос, просто из любопытства. Можете привести пример, если не сложно, я не совсем понимаю, как это: "Вполне возможно, что Ваш код написан с использованием объектов, и Вы на самом деле, сами того не подозревая, сравниваете не величины, а равенство ссылок на объекты. Но про это, не посмотрев на Ваш код, тяжело сказать."? Ну то есть, у меня вот есть класс, я создал объект от него, вызываю у объекта геттеры и с ними арифметические операции выполняю, по идее должно быть все хорошо. – Angedon Feb 27 '22 at 15:14
-
я написал очень простой пример в ответе, если нужно придумать более хитрый пример - дайте знать... правда, с первой попытки в голову ничего не пришло – S.H. Feb 27 '22 at 15:24