2012-04-26 14 views
5

doubleの値をUNIXのsprintf()を使用して文字列に変換する際に、特定の問題が1つあります。sprintf double値の書式設定

double a = 0.009984354523452; 
double b = 0.01; 

変換しながら、私が使用しています:

sprintf(somestringvar, "Double value : %.15f \n", a); 
sprintf(diffstringvar, "Double value : %.15f \n", b); 

は、文字列に変換する

例えば

私は2つの値を持っています。

私の問題は 'a'ですが、値が適切に印刷されていますが、 'b'の値は0が末尾に追加されています。 「a」と「b」を正確な値として表現する一般的な方法を教えてください。

+1

私はこの種のもののためにstd :: ostringstreamを使います。 – Robinson

+1

一般に、 'sprintf()'はバッファオーバーランにつながる可能性があるため、使用しないでください。代わりに 'snprintf()'を使うか、MicrosoftがWindows上で提供する '_s'"安全な "バージョンの1つを使用してください。 p.s.スタックオーバーフローへようこそ! –

+0

早期返答いただきありがとうございます。 ostringstreamは完全な精度を取っていません。値は0.009976としてのみ印刷されます。私はsnprintf()を使うことができますが、問題は値を適切に印字することです。 – sandy

答えて

8

printfに小数点以下15桁(%.15f)を出力するように指示したので、bを印刷するときにゼロが得られます。これは順調です。何か「正確」を得るには、単純な%gで運が良いかもしれません。


[最近のコメントに基づいて更新]

物事は本当にあなたが「正確」で何を意味するかに依存します。正確には、「ユーザーが最初に入力したもの」という意味であれば、ダブルはあなたにとって最良の選択ではないかもしれません。おそらく、値を文字列として格納し、それを計算で使用する必要があるときにdoubleに変換するとうまくいくかもしれません。テキストベースの10進数がdoubleに変換されると、通常、テキストと正確に同じではありません。 printf()またはostreamは正確にダブルが保持しているものを忠実に印刷しますが(そして幸運なことに、元の値と同じに見えるものもあります)、ダブル自体はもはや実際の元の値を保持しません。実際、それは決してしませんでした。

また、本来の倍精度のようなものではなく、正確な数値の実装を優先することもできます。たとえば、MySQLはNUMERIC and DECIMALの型を持っています。これは、精度を完全にサポートしています。事前に整数と小数点以下の桁数を指定する必要があります。これはarbitrary precision arithmeticと呼ばれ、C/C++でこれを行うためのライブラリがあります。

+0

回答をいただきありがとうございます。私はzeoesの追加のための論理部分を理解することができます。しかし、問題は、実行時に私はデータベースから値を読み取る必要があります。上に示したように、値は任意のタイプにすることができるので、正確な値を出力する一般的な方法を探しています。私は '%g'を試してみましたが、値 'a'を正規化しています。0.009976 – sandy

+0

なぜ人々はこれを投票し続けますか?それに問題がある場合は、私がそれを改善するか、自分の別の答えを提供するように話してください。 –