我想通过检查是否比较thickness
Thickness
A等于thickness
B,
而且......它不起作用。总是假的,为什么?
PS。
为什么new Thickness(2.1) returns 2.09923289[..]
不是2.1
并new Thickness(2.0)
返回清除2.0
?
答案 0 :(得分:5)
双值不可安全比较,因为内存中存储了两倍。我建议你使用像if(Math.Abs(Thickness - new Thickness(2.1)) < TOLERANCE)
这样的东西。
您可以进行快速测试并尝试检查以下内容:
var passed = false;
if(0.2 + 0.1 == 0.3)
passed = true;
你会发现它是false
答案 1 :(得分:4)
厚度的左侧,顶部,右侧和底部的值是双倍值。
因此,您必须使用Math.Abs将它们与容差值进行比较。
这些是我在WinUX库中获得的辅助方法,它将为您完成这项工作:
public static readonly double Epsilon = 2.2204460492503131E-16;
public static bool AreClose(Thickness value1, Thickness value2)
{
return AreClose(value1.Left, value2.Left) && AreClose(value1.Top, value2.Top) && AreClose(value1.Right, value2.Right) && AreClose(value1.Bottom, value2.Bottom);
}
public static bool AreClose(double value1, double value2)
{
if (Math.Abs(value1 - value2) < 0.00005)
{
return true;
}
var a = (Math.Abs(value1) + Math.Abs(value2) + 10.0) * Epsilon;
var b = value1 - value2;
return (-a < b) && (a > b);
}
然后你会在你的场景中使用它:
if (AreClose(new Thickness(2.1), lessonGrid.BorderThickness))
{
// Code-here
}
原始来源:https://github.com/jamesmcroft/WinUX-UWP-Toolkit/blob/develop/WinUX/WinUX.Common/Maths/MathHelper.cs