После @McAden и другого сотрудника, который удалил его ответ (или удалил его), проблема заключалась в самом вычислении.
Я объясню причину проблемы, в случае, если кто-то вбудущее наступит после этого.
Unity при выводе на печать с использованием функций Debug.LogXXX
округляет все значения до 2 десятичных знаков.Я пытался найти официальную документацию, но, как оказалось, это часть самого C #.float
(для тех, кто пришел из Java-фона) идентифицируется как объект типа Single
, а при печати печатается с использованием метода ToString()
, который сужает результат до 2 десятичных знаков.
Этоможет вызвать путаницу при выполнении стандартной печати Debug.LogFormat
, поскольку она будет отображать 2 десятичных знака, а в таких случаях, как у меня, разница будет настолько мала, что результат будет округлен до 0.
После более глубокогоОтладка и дальнейшее погружение в фактическое значение разницы, я пришел к точке, где значения, которые я получил, были:
Центр Y Значение: 5.114532
Половина Y Значение: 0,64
Хит Y Значение: 4.474533
Результат разницы: -0.0000001192
Это менее чем идеальный пример, потому что вы можете видеть, что это приведет к разнице -0,000001, до сих пор было много случаев, которые привели к тому, что казалось абсолютным0.
- Для правильного сравнения необходимо соблюдать официальную документацию C # ,который диктует:
В случаях, когда потеря точности может повлиять на результат сравнения, вы можете использовать следующие методы вместо вызова метода Equals или CompareTo:
Call Math.Round метод, чтобы оба значения имели одинаковую точность.В следующем примере модифицируется предыдущий пример для использования этого подхода так, чтобы два дробных значения были эквивалентны.
using System;
public class Example
{
public static void Main()
{
float value1 = .3333333f;
float value2 = 1.0f/3;
int precision = 7;
value1 = (float) Math.Round(value1, precision);
value2 = (float) Math.Round(value2, precision);
Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2, value1.Equals(value2));
}
}
// The example displays the following output:
// 0.3333333 = 0.3333333: True
- Другой подход заключается в реализации
IsApproximatelyEqual
; Проверка приблизительного равенства вместо равенства.Этот метод требует, чтобы вы определяли либо абсолютную величину, на которую эти два значения могут различаться, но все равно быть равными, либо определяете относительную величину, на которую меньшее значение может отклоняться от большего значения.
В конце концов, основной причиной этой проблемы было то, что я проигнорировал более глубокие значения точности, представленные переменными, и, таким образом, не понял, почему сравнение неверно.
Спасибо за вашу помощьНадеюсь, никто не столкнется с такой глупостью:)