93231


下のコードを実行すると`0.100000`と出力が得られる。  
この出力のうち末尾に続く`00000`を表示しないようにしたい。  
具体的には`0.1`のように出力したい。

[code]

    #include <stdio.h>
    
    int main() {
        double a = 0.1;
        printf("%f", a);
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2023-01-07T08:59:23.000
93227
2023-01-23T11:19:35.177
2023-01-07T09:57:55.257
3060
41059
question
c
C言語の関数printfにおいて、実数を表示する際に小数点以下末尾の0を省くには


例えば、以下のように `printf` のフォーマット指定を変更することで、出力結果を小数点1桁目までにすることが出来ます。  
(あくまで "桁数" の指定なので、0を省略ではない点は注意してください)

[code]

    printf("%.1f", a);
    
[/code]


CC BY-SA 4.0
2023-01-07T09:57:26.103
93229
2023-01-07T09:57:26.103
3060
93227
answer


値によっては指数表記になってしまう場合もありますが、質問文の例だと`%g`で末尾の`0`を削除できます。  
<http://tpcg.io/_EEY22Z>

[code]

    printf("%g", a);
    
[/code]


CC BY-SA 4.0
2023-01-07T10:34:27.317
93230
2023-01-07T10:34:27.317
7291
93227
answer


小数点以下の数字０を削除するには変換指定子にgを指定するのがよいでしょう。  
精度以上の場合に指数表記されますので、ある程度大きな精度を指定するのがよいと思います。  
以下の例は精度に16を指定しています。

[code]

     printf("%.16g\n", a);
    
[/code]

[Man page of PRINTF](https://linuxjm.osdn.jp/html/LDP_man-
pages/man3/printf.3.html)からの引用です。

> 変換指定子  
>  g, G  
>  double 引数を f か e (G 変換の場合は F か E) の形式に変換する。 精度は表示する桁数を指定する。
> 精度が指定されない場合は、6桁とみなされる。 精度が 0 の場合は、1桁とみなされる。 変換される値の指数が、 -4 より小さいか、精度以上の場合に、
> e 形式が使用される。 変換された結果の小数部分の末尾の 0 は削除される。小数点が表示されるのは、
> 小数点以下に数字が少なくとも一つある場合にだけである。


CC BY-SA 4.0
2023-01-07T10:50:42.507
93231
2023-01-07T10:50:42.507
35558
93227
answer


akira ejiriさんの回答にも

> 変換される値の指数が、 -4 より小さいか、精度以上の場合に、 e 形式が使用される。

とあるように、

[code]

    printf("%.16g", 0.00001);
    
[/code]

はe形式に切り替わり、 `1e-05` と表現されてしまうため、望まない結果の可能性があります。

`printf`
のマニュアルを読み、望む形式がない場合は、`sprintf`等を使用し一旦文字列を作成した後、望む形式に編集し、`%s`でその文字列を出力する方法があることは覚えておくとよいでしょう。

[code]

    double a = 0.00001;
    char buffer[256];
    int len = snprintf(buffer, sizeof buffer, "%f", a);
    while (0 < --len && (buffer[len] == '0' || buffer[len] == '.'))
        buffer[len] = '\0';
    printf("%s", buffer);
    
[/code]

質問文は厳密には末尾の`0`の削除しか触れられていませんが、では`0.0`ちょうどの場合、`0.`となり不格好なので、意図を汲んで末尾の`0`および`.`を削除し、`0`となるようにしています。この辺りは、文字列をどのように編集したいかに合わせればよいでしょう。


CC BY-SA 4.0
2023-01-08T00:22:53.817
93236
2023-01-08T00:22:53.817
4236
93227
answer


printfには桁数の指定や、左詰め・右詰めなど色々な書式があります。  
ます、それを理解された方が良いと思います。  
よろしかったら↓をみてみてください。  
<https://nijinatu.com/clang-0303-printf/>


CC BY-SA 4.0
2023-01-23T11:19:35.177
93525
2023-01-23T11:19:35.177
56727
93227
answer