-3
double c, d, e;
double a = (c - d) / e;
double b = Math.Floor(a);
Debug.WriteLine(a.ToString() + " " + b.ToString());

上記のコードは、すべての数値が double である 1 つの構成で "3 2" を出力します。これはどのように可能ですか?二重演算による端数誤差のためですか?a.ToString()ただし、小数部分を含む整数を指定する必要があると思います。

4

1 に答える 1

10

それは単に何をするかの問題ですdouble.ToString()。同じことを示す短いが完全なプログラムを次に示します。

using System;

public class Test
{
    static void Main(string[] args)
    {
        // Find the largest double less than 3
        long bits = BitConverter.DoubleToInt64Bits(3);
        double a = BitConverter.Int64BitsToDouble(bits - 1);
        double b = Math.Floor(a);
        // Print them using the default conversion to string...
        Console.WriteLine(a.ToString() + " " + b.ToString());
        // Now use round-trip formatting...
        Console.WriteLine(a.ToString("r") + " " + b.ToString("r"));
    }
}

出力:

3 2
2.9999999999999996 2

現在double.ToString()は次のように文書化されています:

このバージョンの ToString メソッドは、現在のカルチャの一般的な数値書式指定子 ("G") と NumberFormatInfo を暗黙的に使用します。

...そして、一般的な数値書式指定子ドキュメントの状態:

精度指定子は、結果文字列に表示できる最大有効桁数を定義します。精度指定子が省略されているかゼロの場合、次の表に示すように、数値の型によってデフォルトの精度が決まります。

... ここで、表は のデフォルトの精度doubleが 15 であることを示しています。

実際、ここの正確な値は次のとおりです。a

2.999999999999999555910790149937383830547332763671875

...これも有効数字15桁で考えると3です。

于 2013-01-30T21:32:15.850 に答える