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()
ただし、小数部分を含む整数を指定する必要があると思います。
それは単に何をするかの問題です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です。