2016-11-20 11 views
1

私は Thickness Aは、thickness Bに等しい厚みを比較するには?

そして...それはいけない仕事かどうかをチェックすることにより、thicknessを比較したいです。常に偽、なぜ?

ps。

new Thickness(2.1) returns 2.09923289[..]ない2.1new Thickness(2.0)リターンが2.0をクリアするのはなぜ?

thickness

+3

おそらくそれらは2倍の値です。 –

答えて

3

ダブル値があるため、メモリに格納されているか、二重の、比較することは安全ではありません。私はif(Math.Abs(Thickness - new Thickness(2.1)) < TOLERANCE)のようなものを使用することをお勧めします。 あなたは簡単なテストを行うと、のようなものをチェックしてみてください:

var passed = false; 
if(0.2 + 0.1 == 0.3) 
    passed = true; 

をそして、あなたはそれが左、上、右と厚さの下部のためのfalse

+0

'if(Math.Abs​​(lessonGrid.BorderThickness.Bottom-2.1)<0.01)' が動作するようになりました。お返事ありがとうございました – Niewidzialny

+0

あなたは大歓迎です。私の答えがあなたの問題を解決したら、あなたはこの答えを受け入れることができます。 – FCin

+0

うん、それを待って。私は受け入れる前にいくつかの時間を待たなければならない – Niewidzialny

3

値は、二重されていることがわかります値。

このように、許容値と比較するには、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

+2

ありがとう。私は将来それを使用します:) – Niewidzialny