5

UNIXdoubleを使用して値を文字列に変換するときに、特定の問題が 1 つあります。sprintf()

たとえば、次の 2 つの値があります。

double a = 0.009984354523452;
double b = 0.01;

変換中、私は以下を使用しています:

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

文字列に変換します。

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

4

1 に答える 1

8

printf に小数点以下 15 桁 ( %.15f) を出力するように指示したため、b を出力するとゼロが返されます。「正確な」ものを得るには、 simple の方がうまくいくかもしれません%g


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

物事は、「正確」が何を意味するかによって大きく異なります。正確に言えば、「ユーザーが最初に入力したもの」を意味する場合、double は最適な選択ではない可能性があります。おそらく、値を文字列として保存し、計算で使用する必要があるときにそれを double に変換するとうまくいくかもしれません。テキストベースの 10 進数が double に変換されると、通常、テキストとまったく同じではなくなります。printf()orostreamは double が保持するものを忠実に正確に出力しますが (運が良ければ元の値と同じように見えることもあります)、問題は double 自体が実際の元の値を保持しなくなることです。そして実際、それは決してしませんでした。

または、double のように本質的に近似するものよりも、正確な数値の実装を好む場合があります。たとえば、MySQL には、完全な精度をサポートするNUMERIC および DECIMAL型がありますが、整数と小数点以下の桁数を事前に指定する必要があります。これは任意精度演算と呼ばれ、C/C++ でこれを行うためのライブラリがあります。

于 2012-04-26T06:19:58.703 に答える