2011-07-07 7 views
6

私はのように見えるラインでいくつかのコードに出くわした:幅がprintf()の精度よりも小さい点は何ですか?

fprintf(fd, "%4.8f", ptr->myFlt); 

は、これらの日C++くらいで作業していない、私はprintfのとその同類のドキュメントを読んで、この場合、4は「幅」であることを学びました8は「精度」である。幅は、の最小値としてと定義されています。必要に応じて、空白が出力によって占有され、先頭の空白が埋められます。

はケースである、私は「%の4.8f」のようなテンプレートの点がどうなるかを理解することができない、8(必要に応じてゼロ詰め)以来 既に幅ことを確実にする点後の小数4人が満たされ、超過した。だから、私は小さなプログラムを書いた、ビジュアルC++で次の出力与え

// Formatting width test 

#include "stdafx.h" 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    printf("Need width when decimals are smaller: >%4.1f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567); 
    printf("Doesn't matter if argument has no decimal places: >%4.8f<\n", (float)3); 

    return 0; 
} 

:最初のケースで

Need width when decimals are smaller: > 3.5< 
Seems unnecessary when decimals are greater: >3.45670000< 
Doesn't matter if argument has no decimal places: >3.00000000< 

を、精度が指定された幅未満であり、実際には大手スペースが追加されます。しかし、精度が高いほど、幅は冗長に見えます。

このような形式の理由はありますか?

+2

いや、理由はありません。そのようなものが必要な場合は '%0 'を使用します。小数点の左側に何桁あるのか気にしないことを明白にするために、「8f」を使用します。 –

+1

私は元のプログラマーが '1234.87654321'のように書式設定された出力を指定することを意図しているでしょう。私が 'printf()'を発明していたのであれば、私はそれをやったかもしれません(そして、非浮動小数点フォーマットの全体的な幅と精度を扱うためにいくつかの文字を用意しています)。 –

+0

なぜ 'c'ではなく' C++ 'にタグをつけましたか? – leftaroundabout

答えて

3

出力形式の幅が指定された幅より小さい場合、幅形式指定子は出力にのみ影響します。明らかに、これは、精度が幅以上に設定されている場合には発生しません。したがって、この場合、幅の指定は無意味です。

Here's MSDNの記事、最後の文で説明します。

フィールド幅が存在しないか、フィールド幅が小さすぎてもフィールドの切り捨てが発生しません。変換の結果がフィールド幅より広い場合、フィールドは変換結果を含むように展開されます。

0

おそらくちょうど推測ですが、 小数点以下がある場合、精度は小数点以下1桁の長さを超えます。 同様に、幅によって、必要なスペースよりも少ないスペースしか使用できなくなります。 数字のある種類のテーブルを考えると、各行の各列がその列に含まれる数に関係なく同じ幅を持つ場合にのみ、均一な列を実現できます。

したがって精度は、常に2小数点以下が必要な10.00€のような形式で必要になります。

特定の行について:この特殊なケースでは、幅指定子の冗長性が気に入っています。

+0

しかし、4の幅は出力全体(小数点の前後)に適用されます。その出力は、小数点とそれに先行する数字を数えて、おそらく10より狭くすることはできません。精度が8であるため、0でも「0.00000000」となります。 – Buggieboy

+0

すでに述べたように、この場合は何の効果もないようです。たぶん、形式が頻繁に変更された... – Nobody

2

おそらくプログラマーの間違いですか?おそらく、彼らは%8.4fを入れ替えたり、彼らが実際に%12.8fあるいは%012.8f

See codepad sampleを意図:

#include <stdio.h> 

int main() 
{ 
    printf("Seems unnecessary when decimals are greater: >%4.8f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%8.4f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%12.4f<\n", 3.4567); 
    printf("Seems unnecessary when decimals are greater: >%012.4f<\n", 3.4567); 

    return 0; 
} 

出力

Seems unnecessary when decimals are greater: >3.45670000< 
Seems unnecessary when decimals are greater: > 3.4567< 
Seems unnecessary when decimals are greater: >  3.4567< 
Seems unnecessary when decimals are greater: >0000003.4567<