1

私はこれを尋ねるのは少しばかげていると感じます... 桁区切り記号、小数点記号、およびすべての有効桁数を表示するために必要な精度を正確に表示するように数値をフォーマットする必要があります。私は実用的な解決策を持っていますが、もっと良い方法があるはずだと感じています:

double myNumber = 1234.56789;
myNumber.ToString("#,##0.#########################################################################################################################"); // see my problem with this?
// will yield "1,234.56789"

両方のインターネットを最初から最後までグーグル検索しましたが、問題に対する答えが見つかりませんでした。SO のような末尾のゼロの削除C# String.format a number with dynamic number of significant digits のような回答は、千単位の区切り記号の要件を尊重しません。そして、標準数値書式文字列とカスタム数値書式文字列の両方の msdn 記事を読み、再読しましたが、ブレークスルーはありませんでした。

私の注意は、小数点以下の桁数が無制限のString.Format decimalのc#方法にもたらされましたか? 残念ながら、より簡潔なフォーマット文字列を思いついた答えはありませんでした。

正気で熟練した開発者が使用するフォーマット文字列は何ですか?

4

2 に答える 2

-1

あなたが探している答えがグーグルで見つからないのは、あなたの質問に問題があるからです.

double は 10 進数ではなく、2 進数です。したがって、10 進数ベースの「有効桁数」の概念は、あまり意味がありません。たとえば、数値 0.1 は 2 進数で正確に表すことができません (1/3 を 10 進数で正確に表すことができないのと同様)。

@Jamiecが提案したようなこともできます-そしてそれはおそらくあなたが望むものです(N50はやり過ぎですが、バイナリをダブルに変換する最大有効数字は約17桁しか得られません)。しかし、これは実際には有効数字を書き出しているわけではないことを知っておく必要があります。基本的に、コンピューターが数値を計算したすべての有効桁数を 10 進数で書き出すことはできません。コンピューターは、書き出す前にまず 10 進数に変換する必要があります。これにより、必然的に精度が失われます。

于 2015-03-03T15:15:41.487 に答える