2016-09-29 4 views
-1

は一度-0.00を返すように言って、この小さな機能C/C++のsprintfの書式-0

string format_dollars_for_screen(float d) 
{ 
    char ch[50]; 
    sprintf(ch,"%1.2f",d); 
    return ch; 
} 

がありました。

私は

string format_dollars_for_screen(float d) 
{ 
    char ch[50]; 
    float value; 
    sprintf(ch,"%1.2f",d); 
    value = stof(ch); 
    if(value==0.0f) sprintf(ch,"0.00"); 
    return ch; 
} 

にそれを変更し、それは、必要に応じて0.00を返し始めました。私の質問は、なぜこの他のソリューションは動作しないのですか?

string format_dollars_for_screen(float d) 
{ 
    char ch[50]; 
    float value; 
    sprintf(ch,"%1.2f",d); 
    value = stof(ch); 
    if(value==0.0f) sprintf(ch,"%1.2f", value); 
    return ch; 
} 

そして/またはこれを行うより効率的な方法がありますか?これは私の頭の上からちょうど離れているので、批評は大歓迎です。 =)

+0

をあなたは 'sprintf'と固定長文字バッファを(む〜!)これは離れてちょうどCコードで使用している考えますあなたが 'string'を返すという事実からです。 – tadman

+0

@tadman:文字列を返しますが、C++ではまだ標準的なフォーマットソリューションがありません。 – ybungalobill

+0

@ybungalobill "良い"のあなたの定義に依存します。それは[これは未解決の問題です](http://stackoverflow.com/questions/29200635/convert-float-to-string-with-set-precision-number-of-decimal-digits)のようなものではありません。 – tadman

答えて

3

浮動小数点数には、プラスのゼロとマイナスゼロの両方があります。それらは==演算子と等価ですが、他の演算式では1/+0 == +infでは1/-0 == -infの演算結果が異なります。

お客様のケースでは、金額に浮動小数点数を使用しないでください。代わりセント(またはセントの他の小数)をカウントするための整数を使用し、それに応じてそれらをフォーマット:

string format_dollars_for_screen(int cents) 
{ 
    bool neg = cents < 0; 
    if(neg) cents = -cents; 
    char ch[50]; 
    sprintf(ch, "%s%d.%.2d", "-"+!neg, cents/100, cents%100); 
    return ch; 
} 
+2

本当に価値があるのは、**お金を表すために浮動小数点を使用しないことです**。混乱、痛み、苦しみ、悪夢のようなものにつながります。 – tadman

+0

さらに、intには-0はありません。 –

+0

それは価値があるため、お金は 'int'sとして保存されます。浮動小数点として渡される値は、文字通りちょうどかなりセントに切り刻まれています。したがって 'format_dollars_for_screen()'。だから、心配はありません。 ;)また、「+」+「neg」がどのように動作するかを説明することができますか? – musasabi