如何比较厚度?

时间:2016-11-20 12:24:16

标签: c# uwp

我想通过检查是否比较thickness Thickness A等于thickness B,

而且......它不起作用。总是假的,为什么?

PS。

为什么new Thickness(2.1) returns 2.09923289[..]不是2.1new Thickness(2.0)返回清除2.0

thickness

2 个答案:

答案 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