2009-12-07 55 views
8

我有一个浮点数组,其中数据存储在不同的小数点,所以有些是123.40000123.45000123.45600 ...现在如果我想打印这些值在字符串中没有0在printf()结束,因此它们是123.4,123.45,123.456,最后没有那些0。这可能吗?如果是这样,怎么样?在printf()中的浮点格式化

回答

18

使用%克格式化:

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); 
} 
+1

是不是一个坏主意,比较双打? “如果(d-地板(d)== 0.0)” ? – himself 2013-01-15 07:14:29

+1

@himself不,当你知道你在做什么时很好。“绝不比较'=='的浮点数字”仅仅是一个简单的近似值。 – 2014-06-16 19:23:47

0

使用%G -

打印无论是正态还是指数形式的双重数据,无论哪一种更适合其数量级。 'g'使用小写字母,'G'使用大写字母。该类型与定点符号略有不同,因为不包括小数点右侧不显着的零。另外,小数点不包含在整数中。

+0

只是一个小的查询,如果我想删除尾部零但想保留整数的小数点,如124.00000是123,该怎么办? – sfactor 2009-12-07 23:45:33

3

我不知道如何哈克这不过是:

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

0

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

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

编辑

该标准规定了#标志:

#结果被转换为``替代形式 ''。 [...]对于a, e,E,f,F,g和G转换,转换浮点数 的结果始终包含一个小数点字符,即使没有数字后面跟着 。 [...]对于g和G转换,结果不会从 中删除尾部零。 [...]

...但你的尾随零:(