-2

重複の可能性:
printf() で末尾のゼロを避ける

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main(void)
    {
      FILE *file;
      double n;  
      file = fopen("fp.source", "r");
      while(!feof(file)) {
        fscanf(file, "%lf", &n);
        printf("Next double:\"%lf\"\n", n); 
    }
    fclose(file);
    return 0;
    }

こんにちは、浮動小数点数をスキャンしようとしていますが、動作するようになりましたが、末尾に不要なゼロが表示されます。これを回避する方法はありますか?たとえば、現在の出力は次のとおりです。 Next double:"11.540000"

実際に私が望むとき: 次のダブル:"11.54"

4

3 に答える 3

5

それはスキャンの問題ではありません。これはprintf の書式設定の問題です。

ドキュメントから(強調鉱山):

f、F

double 引数は、スタイル の 10 進表記に変換されます"[-]ddd.ddd"。ここで、基数文字の後の桁数は、精度仕様と等しくなります。精度が欠落している場合、それは 6 と見なされます。精度が明示的にゼロで、'#'フラグが存在しない場合、基数文字は表示されません。基数文字が表示される場合、その前に少なくとも 1 つの数字が表示されます。下位桁は、実装定義の方法で丸められます。

あなたはおそらく望むでしょう%g(繰り返しますが、私のものを強調してください):

g、G

double 引数は、有効桁数を指定する精度で、スタイル f または e (G 変換指定子の場合はスタイル F または E) で変換されます。明示的な精度がゼロの場合は、1 と見なされます。使用されるスタイルは、変換される値によって異なります。スタイル e (または E ) は、そのような変換の結果の指数が -4 未満であるか、精度以上である場合にのみ使用されます。末尾のゼロは、結果の小数部分から削除されます。基数文字は、その後に数字が続く場合、または「#」フラグが存在する場合にのみ表示されます。

于 2013-01-28T19:22:06.537 に答える
3

これを回避する方法はありますか?

はい、出力を正しくフォーマットするだけです:

printf("Next double:\"%.0lf\"\n", n);

printf フォーマット文字列の.0は、小数点以下の数字を出力しないことを示します。0小数点以下 1 桁、2 桁、3 桁、またはそれ以上の桁数が必要な場合は、 を他の値に変更できます。

于 2013-01-28T19:20:30.137 に答える
2

これを試して。

printf("Next double:\"%l.0f\"\n", n); 

これは、文字列形式指定子の良いリファレンスです。

http://www.cplusplus.com/reference/cstdio/printf/

于 2013-01-28T19:22:14.790 に答える