2016-12-20 4 views
0

Мой кодкак получить точные значения баллов?

Double x= 400.002015366677,y =300.000014; 
Point point = new Point(x,y); 

В этом выше точки координат значение правильно настройки в WPF но в UWP значения являются changed.Its значение 400,0020141601525 и 300.

Как получить исходное значение точки в uwp?

благодаря ,,

+1

'double' не является точным типом значения. Вы увидите ошибки усечения, и пока программа сделает все возможное, чтобы компенсировать это, она не идеальна. См. Http://stackoverflow.com/questions/753948/why-is-floating-point-arithmetic-in-c-sharp-imprecise – Abion47

+0

Это может быть связано с отсутствием точности чисел с плавающей запятой. https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – JamesFaix

+0

@JamesFaix Значение плавающей запятой не «не соответствует точности». «Точность» не является логическим атрибутом, другими словами, переменная/значение нельзя сказать либо * точно, либо * неточно. Вместо этого точность является относительным термином, переменная/значение может быть указана с точностью до определенного количества цифр. –

ответ

0

В отличие от 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.

Смежные вопросы