これは先頭または末尾のゼロの数と関係があると思いますが、msdnには具体的な答えを示すものが見つかりません。
Double.ToString(CultureInfo.InvariantCulture)
科学的記数法で値を返し始めるのはどの時点ですか?
これは先頭または末尾のゼロの数と関係があると思いますが、msdnには具体的な答えを示すものが見つかりません。
Double.ToString(CultureInfo.InvariantCulture)
科学的記数法で値を返し始めるのはどの時点ですか?
ドキュメントから、数値を表す最もコンパクトな形式が選択されることになります。
つまり、フォーマット文字列を指定しない場合、デフォルトは「G」フォーマット文字列です。Gフォーマット文字列の仕様から次のようになります。
結果:固定小数点表記または科学的記数法の中で最もコンパクトです。
桁数のデフォルトは、指定子で15です。つまり、指数表記がよりコンパクトでない限り、特定の2進表現(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
として書かれているのかを示すためです。デフォルトでは、有効数字15桁が表示されます。より多くの桁がある場合(そして特定の特別な数を除いて常にある場合)、これらは通常の方法で丸められます。丸め後、冗長なゼロは削除されます。0.2
0,20000000000000001
doubleの精度は、数値に応じて15桁または16桁であることに注意してください。したがって、15桁を表示すると、正しく切り捨てられた数値であり、常に完全な表現であり、doubleの最短表現です。
のドキュメントからDouble.ToString(IFormatProvider)
:
このインスタンスは、一般的な数値フォーマット指定子( "G")でフォーマットされています。
General Numeric Format Specifierのドキュメントから:
固定小数点表記は、科学的記数法で数値を表現した結果の指数が-5より大きく、精度指定子よりも小さい場合に使用されます。それ以外の場合は、科学的記数法が使用されます。結果には、必要に応じて小数点が含まれ、小数点の後の末尾のゼロは省略されます。精度指定子が存在し、結果の有効桁数が指定された精度を超える場合、余分な末尾の桁は丸めによって削除されます。
ただし、数値が10進数で、精度指定子が省略されている場合は、固定小数点表記が常に使用され、末尾のゼロが保持されます。
のデフォルトの精度指定子Double
は15であると文書化されています。
表の前半ですが、言い方が少し異なります。
結果:固定小数点表記または科学的記数法の中で最もコンパクトです。
これらの2つが常にDouble
値と同等であるかどうかはわかりません...
編集:アベルのコメントによると:
また、これは必ずしも最もコンパクトな表記ではありません。0.0001は1E-04よりも大きいですが、最初のものが出力されます。MSドキュメントはここでは完全ではありません。
もちろん、これはより詳細な説明と一致します。(必要な指数は-5より大きく15より小さいため)
これは、「固定小数点表記または科学的記数法のいずれかで最もコンパクトな」http://msdn.microsoft.com/en-us/library/dwhawy9kを使用するように指定されたフォーマッター「G」(「一般」の略)を使用します。 aspx
したがって、固定小数点は科学的記数法を支持する0.00001
よりも多くの文字であるためです。1E-05
それらが同じ長さである場合、それは固定小数点を支持すると思います。
私はループでこれを試しました:
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