2012-02-20 23 views
0

私は次のコードスニペットを持っています。CString。フォーマットの問題

double db = 1/1000000; 
CString csStr(""; 
csStr.Format('%.10f',ct); 

基本的にdbの値は0.000001です。
この値をそのままcsStrに保存する必要があります。
MFC VC++で正しい形式の文ですか?
また、dbは、1/100または1/100000000000とすることができます。

csStrには、真偽値または丸め値を格納しないでください。それは可能ですか?

答えて

1

現在地に対処するには、2つの問題を抱えて:

  1. 浮動小数点型ではなく、任意精度タイプですが、あなたはあなたがそれらにしたい任意の値を格納することはできません。いくつかの値は正確な浮動小数点表現を持ち、あるものはそうでないものもあります。
  2. 任意の精度タイプがあっても、その(一般的な)文字列表現は保存できません。つまり、1.0/3.0を計算して文字列に丸められていない結果を格納したい場合、無限の文字が必要になります。

だから、一般的に聞いたことはありません。

ここで求めている値は、正確な有限小数点、10進表現(すべてが正確なFP表現ではない)を持ち、CString :: Formatの四捨五入により、あなたがうまくいけば、csStrに格納されている正しい値を得る可能性が最も高いでしょう。

double db = 1/1000000; // [1] 
CString csStr("");   // [2] 
csStr.Format("%.10f", db); // [3] 

[1]この店舗デシベルで0.0:

あなたのコードは、(それがコンパイルされるように補正された)いくつかの問題があります。除算は整数として計算され、0が得られ、次にdoubleに変換されます。代わりにdouble db = 1.0/1e6;(または1.0/1000000)を実行してください。

[2]イニシャライザは必要ありません。 CStringsは空の文字列として初期化されます

[3]文字列に "0.0000010000"が格納されます。 末尾のゼロを必要としない場合は、フォーマットとして "%lf"と書いてください。 文書によると、 "値は適切な桁数に丸められています"。精度が十分であれば、適切な数値が得られますが、精度が十分でない場合(たとえば、精度6を指定し、数値が0.00000001の場合)は、0.0に丸められます。または、指定された精度に設定します。

どうすればよいですか?あなたの場合、あなたは1/100または1/100000000000になるでしょう。それが本当であれば(あなたはその2つの値だけを持つことができます)、それは変化しないものです(これはあなたがやっていることに依存しますが、私はそれを信じません)、除数を格納して、オンザフライで、ifまたは何かで。

"%g"形式指定を使用することもできます。丸めも行いますが、末尾のゼロは削除されます。警告(またはあなたがやっていることに応じて良いこと)は、「1e-6」形式でいくつかの値を入れることができる(そしてそうする)ことです。

関連する問題