Необычная ошибка округления с плавающей точкой в ​​Unity / C #? - PullRequest
0 голосов
/ 24 июня 2018

Я использую актив из Unity Asset Store под названием World Map Strategy Kit для работы над настольной игрой.В комплекте используется список Vector2 со значениями в диапазоне от -0,5 до +0,5 для определения границ провинций / стран на моей карте.

Я работаю над чтением путей SVG и преобразованием их в списки точек, которыеВходные данные WMSK.

По сути, не давая вам весь метод анализа 40 строк, у меня есть настройка, подобная приведенной ниже:

string raw = "1213.6788";
float x = float.Parse(raw);
float y = float.Parse(raw);
Vector2 a = new Vector2 (x, y);
Debug.Log(a);

Он последовательно округляет результат до 1213,7.

Сначала я подумал, что это может быть просто причудой с помощью метода Parse с плавающей точкой, поэтому я написал адаптированную версию, показанную ниже:

string raw = "1213.6788";
float x = (float)double.Parse(raw);
float y = (float)double.Parse(raw);
Vector2 a = new Vector2 (x, y);
Debug.Log(a);

То же самое.Он округляется до ближайшей десятой.

Я заметил нечто похожее ниже:

string rawX = "1213.6788";
string rawY = "891.7";
float x = (float)double.Parse(raw);
float y = (float)double.Parse(raw);
Vector2 a = new Vector2 (x, y);
int tw = 2500;
int th = 1250;
Vector2 translated = new Vector2 ();
translated.x = (a.x - tw * 0.5f + 0.5f) / tw;
translated.x = (a.y - th * 0.5f + 0.5f) / th;
Debug.Log(a);

Теперь вывод: (0,0, 0,2)

Что опятьокругляя его до десятых.Я могу принять приличную степень неточности, но это просто недопустимо - я пытаюсь перевести координаты из системы координат 2500 × 1250 в систему координат 1 × 1 в диапазоне от -0,5 до +0,5.Я ожидаю, что большинству координат потребуется 3-5 знаков после запятой для правильного хранения.

Ни на одном языке программирования, с которым я работал, даже на Java, числа с плавающей запятой периодически и последовательно округляются до десятых.,Это просто не то, что они обычно делают в моем опыте.

Итак, вопрос в том, что я делаю не так?Я имею в виду, что, конечно, можно анализировать информацию в плавающем потоке БЕЗ потери почти всех моих десятичных разрядов информации?

Может ли это быть каким-то образом мой компьютер (у меня относительно слабый и архаичный ноутбук, 1 ГГц IntelПроцессор с 2 ГБ оперативной памяти от 2010 года - да, я знаю, что мне нужно обновление)?

Или это для Unity?Может ли это быть структура данных Vector2, вызывающая потери?

1 Ответ

0 голосов
/ 24 июня 2018

Unity по умолчанию VectorX.ToString() (используется при преобразовании в текст для показа в ваших Debug.Log() вызовах), поскольку его максимальная точность равна десятым долям.

Для большей точности просто вызовите .ToString() в произвольном формате: Например, чтобы отображать с точностью до тысяч, используйте Debug.Log(yourVectorX.ToString("F4"));

ПРИМЕЧАНИЕ. Базовое значение должно быть правильным;просто отображается как округленный в тексте.

...