1

ここでは、double変数を乗算およ​​び加算し、それらを期待される結果と比較する簡単なアプリケーション例を示します。どちらの場合も、結果は期待される結果と同じですが、比較を行うと失敗します。

static void Main(string[] args)
{
    double a = 98.1;
    double b = 107.7;
    double c = 92.5;
    double d = 96.5;

    double expectedResult = 88.5;
    double result1 = (1*2*a) + (-1*1*b);
    double result2 = (1*2*c) + (-1*1*d);            

    Console.WriteLine(String.Format("2x{0} - {1} = {2}\nEqual to 88.5? {3}\n", a, b, result1, expectedResult == result1));
    Console.WriteLine(String.Format("2x{0} - {1} = {2}\nEqual to 88.5? {3}\n", c, d, result2, expectedResult == result2));

    Console.Read();
}

出力は次のとおりです。

2x98.1 - 107.7 = 88.5
Equal to 88.5? False

2x92.5 - 96.5 = 88.5
Equal to 88.5? True

True実際には両方のケースであることをキャプチャできる必要があります。どうすればいいですか?

4

7 に答える 7

0

Double.Epsilonおよび同様の数字の使用に反対する考え方が一堂に会しています...

私は彼らがこれを使用しているIsNaN思います:IsInfinity

public static bool AboutEqual(double x, double y)
{
    if (double.IsNaN(x)) return double.IsNaN(y); 
    if (double.IsInfinity(x)) return double.IsInfinity(y) && Math.Sign(x) == Math.Sign(y);

    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}

「マジック ナンバー」は、 s の精度が 15 桁を少し上回る1E-15という事実に基づいています。double

私はあなたの数字のためにそれがtrueを返すことを追加します:-)

于 2013-08-06T13:26:09.237 に答える