В отличие от Point Structure используется в WPF, Point structure в UWP является структура среды выполнения Windows, что под Windows.Foundation имен и может использоваться во всех .NET, C++ и JavaScript.
Если мы посмотрим на Fields of Point structure, мы найдем поля использовать тип данных следующим образом:
Номер [JavaScript] | System.Single [.NET] | float32 [C++]
Таким образом, внутренне, значение хранится в виде одинарной точности 32-битного числа. Однако, используя язык Microsoft .NET, элементы данных Point отображаются как объекты double
, а не поля.
Ref проекции и члены Поинт раздел Замечания:
Если вы используете язык Microsoft .NET (C# или Microsoft Visual Basic) или Visual C++ расширения компонентов (C++/CX), то Point имеет не-данные члены доступны, и его члены данных отображаются как свойства чтения-записи, а не поля. .NET поддерживает эту функциональность через сборку System.Runtime.WindowsRuntime.dll, которая поставляется как часть приложений .NET для Windows Runtime.
Так при использовании C# или Visual Basic, мы используем Point.Point constructor, который принимает два System.Double параметры. Для C# или Visual Basic тип данных Point.X и Point.Y также является System.Double
.
И то, что происходит в вашем коде является то, что при инициализации, ваши x
и y
значения сначала преобразуются в System.Single
и при получении имущества, он превращается в System.Double
снова, как:
Double x = 400.002015366677, y = 300.000014;
Double X = Convert.ToDouble(Convert.ToSingle(x)); //X is 400.00201416015625
Double Y = Convert.ToDouble(Convert.ToSingle(y)); //Y is 300
Для Point structure, я боясь, что мы не сможем получить точную оригинальную ценность. Point обычно используется для позиционирования и рендеринга пользовательского интерфейса. В этом случае рекомендуется использовать целочисленные значения.
Х и Y для точки может быть не целочисленные значения.Однако это может привести к возможности субпиксельной рендеринга, которая может изменять цвета и сглаживать любую прямую линию вдоль края субпикселя. Вот как движок рендеринга XAML обрабатывает границы субпикселей. Поэтому для достижения наилучших результатов используйте целочисленные значения при объявлении координат и форм, которые используются для позиционирования и рендеринга пользовательского интерфейса.
Если вам нужны двойные значения, я бы предложил вам определить новую структуру и не использовать Point.
'double' не является точным типом значения. Вы увидите ошибки усечения, и пока программа сделает все возможное, чтобы компенсировать это, она не идеальна. См. Http://stackoverflow.com/questions/753948/why-is-floating-point-arithmetic-in-c-sharp-imprecise – Abion47
Это может быть связано с отсутствием точности чисел с плавающей запятой. https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – JamesFaix
@JamesFaix Значение плавающей запятой не «не соответствует точности». «Точность» не является логическим атрибутом, другими словами, переменная/значение нельзя сказать либо * точно, либо * неточно. Вместо этого точность является относительным термином, переменная/значение может быть указана с точностью до определенного количества цифр. –