3.printfを使いこなそう

3-8. 精度

◆精度

次は精度の設定です。ここでは、精度の意味について少し述べます。

たとえば、

3.1415926535

という数があります。(…て円周率じゃん!)

しかし、ここまで表示する必要がないので小数点以下第2までにします。

このときに精度を2と設定してあげると、(%fの場合)

3.14

になります。

◆整数型の場合

まず、整数型の精度のデフォルトは1です。整数型の場合表示する桁数の最小を設定します。なのでデフォルトの1の場合最低1桁の表示がなされるということになります。(0でも0と表示されるわけ)

1230
230
30
0

つまり精度を0にすると、数値が0のとき表示されなくなってしまいます。

1230
230
30

逆に精度を大きくしたときは余った桁を0で埋めます。
(精度4の時)

1230
0230
0030
0000

printf()での設定はどうなるかというと、

% のあと.(数字)で設定します。
もちろんフィールド幅と併用できます。

#include<stdio.h>
main()
{
    printf("%.3d\n",12);  /* 精度3 */
    printf("%1.3d\n",23); /* フィールド幅の併用可 */
    printf("%.0d\n",0);   /* 精度0で値0だと表示されない */
}

結果:
012
023

となりました。

◆実数型の場合

◇f,e,E

精度と言うには実数型の場合が一番ふさわしいと思います。
No.033に出てきた円周率の例を使ってやってみようと思います。

円周率=3.1415926535…

これを精度を指定しないままで表示すると

#include<stdio.h>
main()
{
    printf("%f\n",3.1415926535);
    printf("%e\n",3.1415926535);
}

結果:

3.141593
3.141593e+000

と表示されます。

ここでの精度は小数点以下の桁数の指定になります。
そして、デフォルトは6であり、それ以下は四捨五入されます。

今度は円周率を100倍して表示してみました。

#include<stdio.h>
main()
{
    printf("%f\n",3.1415926535*100);
    printf("%e\n",3.1415926535*100);
}

結果:

314.159265
3.141593e+002

あくまで、小数点以下第6位までの表示になっています。

それでは、このデフォルトの値を変えて0にしたらどうでしょうか?

#include<stdio.h>
main()
{
    printf("%.0f\n",3.1415926535);
    printf("%.0e\n",3.1415926535);
}

結果:
3
3e+000

となり、小数点まで省略されてしまいました。

◇g,G

g、Gの場合の精度は有効桁数になります。

#include<stdio.h>
main()
{
    printf("%g.3\n",1.2345);
    printf("%g.3\n",0.12345);
    printf("%g.3\n",0.0000012345);
}

結果:
1.23
0.123
1.23e-006

どれも有効数字3桁になっています。

◇s

文字列の場合は出力する最大文字数になります

#include<stdio.h>
main()
{
    printf("%.10s\n","文字列の場合は");
}

結果:

文字列の場

となります。

◇アスタリスクを使う

精度でもアスタリスクが使えます。

#include<stdio.h>
main()
{
    printf("%.*s\n",10,"文字列の場合は");
}

結果:

文字列の場

このようにアスタリスクに対応する整数型のデータを精度として扱います。

フィールド幅との併用もできます。

#include<stdio.h>
main()
{
    printf("%*.*s\n",15,10,"文字列の場合は");
}

結果:

文字列の場

ここでは15がフィールド幅10が精度として対応しています。