先行ゼロまたは後ろゼロの数と関係があると思いますが、具体的な答えを示すmsdnには何も見つかりません。Double.ToString()はいつ科学的表記法で値を返しますか?
Double.ToString(CultureInfo.InvariantCulture)
は何時から科学的表記法で値を返すのですか?
先行ゼロまたは後ろゼロの数と関係があると思いますが、具体的な答えを示すmsdnには何も見つかりません。Double.ToString()はいつ科学的表記法で値を返しますか?
Double.ToString(CultureInfo.InvariantCulture)
は何時から科学的表記法で値を返すのですか?
:
このインスタンスは、一般的な数値形式指定子( "G")でフォーマットされています。General Numeric Format Specifierためのドキュメントから
:科学的表記の数を発現から生じる指数-5と精度指定未満より大きい場合
固定小数点表記が使用されます。それ以外の場合は、科学記法が使用されます。結果には必要に応じて小数点が含まれ、小数点の後には末尾のゼロが省略されます。精度指定子が存在し、結果の有効数字の桁数が指定された精度を超える場合は、四捨五入によって余分な末尾桁が削除されます。
ただし、数値がDecimalで精度精度指定子が省略されている場合は、常に固定小数点表記が使用され、末尾の0は保持されます。
Double
のデフォルトの精度指定子は、テーブル内の以前のバージョンでは、それは若干異なる言い回しだが、15
ように文書化されています
結果:いずれかの固定小数点の最もコンパクトか科学的表記法。アベルさんのコメントを1として:私は...これら二つは常に
Double
値と同等であるかどうかを外にEDIT働いていない
をまた、それは常に最もではありませんコンパクト表記。 0.0001は1E-04より大きいが、最初のものが出力される。 MSのドキュメントはここでは完全ではありません。
これはもちろん、より詳細な説明と一致します。 (必要な指数が-5より大きく15より小さい)
私はループでこれを試してみた:
double a = 1;
for (var i = 1; i < 10; i++)
{
a = a/10;
Console.WriteLine(a.ToString(CultureInfo.InvariantCulture));
}
を出力した
0.1
0.01
0.001
0.0001
1E-05
1E-06
1E-07
1E-08
1E-09
私は同様の実験を試みましたが、変換がなぜ起こったのかについての正確な答えはまだありませんでした。 – geekchic
数を表現するための最もコンパクトなフォームが選択されることを、以下のドキュメントから。
つまり、フォーマット文字列を指定しない場合、default is the "G" format stringです。 specification of the G format stringから:
結果:固定小数点表記または科学表記のいずれかが最もコンパクトです。
default for the number of digitsは15の指定子である。つまり、と正確にはのような特定のバイナリ表現(harriyottの例では0.1など)は、指数表記がよりコンパクトでない限り固定小数点として表示されます。
さらに数字がある場合、デフォルトではすべての数字が表示され(15まで)、短いほど指数表記が選択されます。
が一緒にこれを置く:
?(1.0/7.0).ToString()
"0,142857142857143" // 15 digits
?(10000000000.0/7.0).ToString()
"1428571428,57143" // 15 significant digits, E-notation not shorter
?(100000000000000000.0/7.0).ToString()
"1,42857142857143E+16" // 15 sign. digits, above range for non-E-notation (15)
?(0.001/7.0).ToString()
"0,000142857142857143" // non E-notation is shorter
?(0.0001/7.0).ToString()
"1,42857142857143E-05" // E-notation shorter
そして、関心のを:
?(1.0/2.0).ToString()
"0,5" // exact representation
?(1.0/5.0).ToString()
"0,2" // rounded, zeroes removed
?(1.0/2.0).ToString("G20")
"0,5" // exact representation
?(1.0/5.0).ToString("G20")
"0,20000000000000001" // unrounded
これは、シーンの背後に何が起こるかを示すために、なぜ0.2
は実際にある0.2
、ない0,20000000000000001
、と書かれていますです。デフォルトでは、15桁の有効数字が表示されます。より多くの桁がある場合(そして特定の特殊な数字を除いて常に存在します)、これらは通常の方法で丸められます。四捨五入後、冗長ゼロが削除されます。
doubleは、数値によって15または16桁の精度があることに注意してください。したがって、15桁の数字を表示すると、正しく切り捨てられた数字が表示され、は常に完全な表記であり、最短の表記はです。
固定小数点0.00001
が多いので、そう
「を固定小数点または科学的表記法のいずれかの最もコンパクト」を使用するように指定されているフォーマッタ(「一般」の)「G」を使用しhttp://msdn.microsoft.com/en-us/library/dwhawy9k.aspx文字は1E-05
よりも科学的表記が好ましいでしょう。私は彼らが等しい長さの場合、それは固定小数点を好むと思います。 Double.ToString(IFormatProvider)
ためのドキュメントから
'0.0001'は' 1E-04'よりも多くの文字を持っていますが、好きです...;) – Abel
答えは精度の指定子が含まれていません。デフォルトは '15'です。また、常に最もコンパクトな表記であるとは限りません。 '0.0001'は' 1E-04'より大きいが、最初のものが出力される。 MSのドキュメントはここでは完全ではありません。 – Abel
@Abel:両方のビットが含まれます。ありがとうございます。 –
私は、「最もコンパクト」という言葉に同意せず、msdnのドキュメントをこの点で誤解を招くものと考えています。ダブルx = 13950を取ると、G4フォーマットは "1.395E + 04"を生成します。これは「最もコンパクト」からの距離です。私の意見では、 "G"形式は、C、Fortranなどでよりうまく動作し、 "最もコンパクトな"文字列を実際に生成しました。 C#は私に回避策を探すように強制する... –