如何获得准确的积分值?

时间:2016-12-20 11:46:14

标签: c# wpf uwp

我的代码是

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

在此上面的点坐标值在WPF中正确设置   但在UWP中,值已更改。其值为400.0020141601525   和300。

如何在uwp中获取point的原始值?

感谢,,

1 个答案:

答案 0 :(得分:0)

与WPF中使用的Point Structure不同,UWP中的Point structure是一个Windows运行时结构,位于Windows.Foundation命名空间下,可以在.NET,C ++和JavaScript中使用。

如果我们查看Fields of Point structure,我们会发现这些字段使用的数据类型如下:

  

数字 [JavaScript] | System.Single [.NET] | float32 [C ++]

在内部,该值存储为单精度32位数。但是,在使用Microsoft .NET语言时,Point的数据成员公开为double属性,而不是字段。

备注的参考投影和积分部分:

  

如果您使用的是Microsoft .NET语言(C#或Microsoft Visual Basic)或Visual C ++组件扩展(C ++ / CX),那么Point可以使用非数据成员,并且其数据成员以读写方式公开属性,而不是字段。 .NET通过System.Runtime.WindowsRuntime.dll互操作程序集支持此功能,该程序集作为.NET for Windows运行时应用程序的一部分提供。

因此,在使用C#或Visual Basic时,我们使用接受两个Point.Point constructor参数的System.Double。对于C#或Visual Basic,Point.XPoint.Y属性的数据类型也是System.Double

您的代码中发生的情况是,在初始化时,您的xy值会首先转换为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通常用于UI定位和渲染。在这种情况下,建议使用整数值。

  

X Y 可以是非整数值。然而,这可以引入子像素渲染的可能性,其可以改变颜色并消除沿着子像素边缘的任何直线的混叠。这就是XAML渲染引擎如何处理子像素边界。因此,为了获得最佳结果,请在声明用于UI定位和渲染的坐标和形状时使用整数值。

如果您确实需要双倍值,我建议您定义新结构,不要使用Point