2011-01-24 27 views
5

C++は私の言葉ではないので、この単純な問題を許してください。文字列から倍精度への変換で精度が失われています。だれでも助けてくれますか?私はmemsetの機能には%fでプレーしたC++精度を失う変換を倍増させる文字列?

string lAmount; 

string lSuspendedInt = "131663.51"; 
string lAccruedInterest = "0.0"; 
double dSuspendedInt= atof(lSuspendedInt.c_str()); //PROBLEM HERE? 
double dAccruedInterest = atof(lAccruedInterest.c_str()); 
double dTotal = dSuspendedInt + dAccruedInterest; 

char cAmount[50]; 

memset(cAmount,0X00,sizeof(cAmount)); 
    sprintf(cAmount,"%g*",dTotal); 
    lAmount = cAmount; 


cout << "lAmount: "<<lAmount<<endl; //PRINTING: 131664 not 131663.51 

しかし、これは事前に131663.510000

感謝を与えます。

Sapatos

+0

この金額の金額が必要な場合は、代わりに固定小数点の使用を検討します。 C++側では、atof以外にも文字列をdoubleに変換するより良い方法があると確信しています。問題があると思うなら、sprintf()もそれを実行する別のCの方法です。コメントとして私はあなたのために正確な答えを持っていません。 –

+1

@Michael:ストリームを使用することはできますが、かさばるのですが、C++ 0xは標準ライブラリの一部として特定の 'stof'(およびファミリ全体)命令を導入しています。 –

答えて

3

問題は%gフォーマット演算子です。精度は十分に指定されていません。代わりに%.2fが必要な場合があります。これは小数点以下2桁を出力します。

+0

thanskは動作します – sapatos

2

sprintf%gフォーマット指定のデフォルト6桁の有効数字を印刷します。あなたがより多く必要な場合は、明示的にどのように多くを指定することができ、印刷する必要があります。

sprintf(cAmount,"%.8g*",dTotal); 
1

機能atofはダブルを作成します。 hereを参照してください。あなたの問題は、%gが浮動小数点または科学記法のいずれか短い方を返すことです。 hereを参照してください。また、*という表記法を追加していることに注意してください。これは、印刷文字数に期待される切り捨てがあることを示しています。

+0

*はタイプミスです:( – sapatos

+0

'*'表記は、変換指定子の前にある必要があります。これは、通常の文字としてプリントアウトされたものです。 –

関連する問題