6

私のシステムでは、次のコードは「3.6」を出力します。

double a = 1.2;
int b = 3;

double c = a * b;

Console.WriteLine(c);

cしかし、デバッガーでは、2 桁を超える値があることがわかります。

ここに画像の説明を入力

で完全な表現を表示できることを知っていConsole.WriteLine("{0:R}", c)ます。これが a の実際の値を表示する唯一の推奨される方法doubleですか?


アップデート

上記の例をc使用して、ユーザーが印刷された値を取得し、それを を使用したテストでコードに挿入した場合==、比較が真になるように印刷したいと思います。この場合、c == 3.5999999999999996true を返します。

4

4 に答える 4

8

3.999999999999996 も double の実際の値ではありません。これは、15 桁などに丸められた値です。double が表す実際の正確な値を表示する組み込みの方法はありません。通常の double はすべて 10 進文字列として正確に表現できるため、これは本当に残念です。

公共サービスとして、それを行うデバイスのソース コードをブログに掲載しました。

http://ericlippert.com/2011/02/17/looking-inside-a-double/

Microsoft Solver Foundation の Rational クラスを使用していることに注意してください。それがない場合は、無料でダウンロードするか、独自の Rational クラスを作成できます。そうするのはキャラクター構築です。

double が内部的にどのように機能するかという主題に興味がある場合は、そのすべてを説明する便利な記事のアーカイブをチェックすることを検討してください. 次の場所にあります。

http://blogs.msdn.com/b/ericlippert/archive/tags/floating+point+arithmetic/

下から始めます。それらは逆時系列順です。

于 2012-12-29T04:34:15.200 に答える
8

Console.WriteLine「G」フォーマット指定子Double.ToStringを使用する呼び出し。これは、現在のカルチャを使用して小数点以下の桁数を決定します ("en-US" の場合は 1)。

小数点以下 8 桁を表示する場合は、数値書式指定子を使用できます。

Console.WriteLine(c.ToString("N8"));

標準数値フォーマット文字列

編集: デバッガーはこのメソッドを使用して double を文字列に変換します。

_ecvt_s

一番安く変換できる方法だと思います。

私が見つけた場所: Visual Studio はデバッグ中に System.Double をどのように表示しますか?

于 2012-12-29T00:50:12.703 に答える
5

たとえば、小数点以下2桁を返したい場合は、次のような方法を試すことができます。

double a = 1.2;
int b = 3;
double c = a * b;
var s = string.Format("{0:0.00}", c);
Console.WriteLine(s);

出力 = 3.60

出力が3.6である最後の0を抑制したい場合は、次のことができます

var s = string.Format("{0:0.##}", c);

Output = 3.6 自由にいじってみてください

于 2012-12-29T01:01:16.837 に答える
1
double a = 1.2;
int b = 3;

double c = a * b;
string formatted = c.ToString("N5");
Console.WriteLine(formatted);
于 2012-12-29T00:45:47.230 に答える