0

小数点がコンソールに表示されるという奇妙な動作が見つかりました。これは、次のコードで最もよく説明されます。

string num1AsString = "1.0000";
decimal num1AsDecimal = decimal.Parse(num1AsString);

string num2AsString = "1";
decimal num2AsDecimal = decimal.Parse(num2AsString);

Console.WriteLine(num1AsDecimal);
Console.WriteLine(num2AsDecimal);

コンソールへの出力は次のとおりです。

1.0000
1

ただし、num1AsDecimalとnum2AsDecimalは、デバッガーに1としてのみ表示されます。num1AsDecimalはどういうわけか.0000を保持していますか?それはどういうわけかその文字列表現を保持しているようです。ここでボクシングのようなものがありますか?

ビリースタック

4

3 に答える 3

2

これはJonSkeetリンクからの素晴らしい説明です。ゼロを維持するを参照してください。

于 2012-05-17T10:25:12.470 に答える
2

小数点がコンソールに表示されるという奇妙な動作が見つかりました。

それはまったく奇妙ではありません。文書化されています:

スケーリング係数は、10進数の後続ゼロも保持します。末尾のゼロは、算術演算または比較演算の10進数の値には影響しません。ただし、適切なフォーマット文字列が適用されている場合は、ToStringメソッドによって末尾のゼロを明らかにすることができます。

つまり、ここで少し奇妙なのはデバッガーの動作であり、ではありませんToString()。デバッガーでは、を見るnum1AsDecimal.ToString()と、後続のゼロも保持されるはずです。

于 2012-05-17T10:26:26.453 に答える
2

のMSDNページの脚注は次のようにDecimal.Parse述べています。

decimal.Parseの10進数の結果は、解析元の文字列と同じ有効桁数になります。つまり、「3.43」と「3.4300」は同じ数値に解析しているときに、異なる小数表現になります。これは、小数の2進表現の説明で(ある程度)説明されています。

于 2012-05-17T10:26:36.903 に答える