9

我有一个浮点数组,其中数据以不同的小数点存储,所以有些是123.40000, 123.45000, 123.45600...到底。这可能吗?如果是这样,怎么做?printf()123.4123.45123.456

4

4 回答 4

19

使用 %g 格式化程序:

printf( "%g", 123.4000 );

印刷

123.4

尾随零被删除,但不幸的是,如果小数部分为零,尾随小数点也是如此。我不知道是否真的有任何方法可以直接使用 printf() 来做你想做的事——我认为这样的事情可能是你最好的选择:

#include <stdio.h>
#include <math.h>

void print( FILE * f, double d ) {
    if ( d - floor(d) == 0.0 ) {
        fprintf( f, "%g.", d );
    }
    else {
        fprintf( f, "%g", d );
    }
}

int main() {
    print( stdout, 12.0 );
    print( stdout, 12.300 );
}
于 2009-12-07T23:26:17.193 回答
3

我不知道这有多hacky,但是:

http://codepad.org/e3Q3pUNd

float f = 124.000;
if (f == (int) f) {
    printf("%.1f\n", f); /* .1 can be changed */
} else {
    printf("%g\n", f);
}

退货124.0

float f = 124.123000;
if (f == (int) f) {
    printf("%.1f\n", f); /* .1 can be changed */
} else {
    printf("%g\n", f);
}

退货124.123

于 2009-12-08T00:04:50.313 回答
0

打印到(足够大的)缓冲区。打印缓冲区...如果缓冲区中没有'.',则打印一个点。

char buf[100];
sprintf(buf, "%g", val);
printf("%s", buf);
if (strchr(buf, '.') == NULL) putchar('.');

编辑

该标准指定了#标志:

# 结果被转换为“另一种形式”。[...] 对于 a、A、e、E、f、F、g 和 G 转换,浮点数的转换结果始终包含小数点字符,即使它后面没有数字。[...] 对于 g 和 G 转换,不会从结果中删除尾随零。[...]

...但你得到尾随零:(

于 2009-12-08T00:43:47.150 回答
0

使用 %g --

以正态或指数表示法打印双精度数,以更适合其大小为准。“g”使用小写字母,“G”使用大写字母。这种类型与定点表示法略有不同,因为它不包括小数点右侧的微不足道的零。此外,整数不包括小数点。

于 2009-12-07T23:28:44.397 回答