【发布时间】:2012-03-09 03:46:13
【问题描述】:
如果使用 printf 与 0 不同,是否可以将 C 中的浮点数格式化为最多显示 2 位小数?
例如:
12 => 12
12.1 => 12.1
12.12 => 12.12
我尝试使用:
float f = 12;
printf("%.2f", f)
但我明白了
12 => 12.00
12.1 => 12.10
12.12 => 12.12
【问题讨论】:
如果使用 printf 与 0 不同,是否可以将 C 中的浮点数格式化为最多显示 2 位小数?
例如:
12 => 12
12.1 => 12.1
12.12 => 12.12
我尝试使用:
float f = 12;
printf("%.2f", f)
但我明白了
12 => 12.00
12.1 => 12.10
12.12 => 12.12
【问题讨论】:
您可以使用%g 格式说明符:
#include <stdio.h>
int main() {
float f1 = 12;
float f2 = 12.1;
float f3 = 12.12;
float f4 = 12.1234;
printf("%g\n", f1);
printf("%g\n", f2);
printf("%g\n", f3);
printf("%g\n", f4);
return 0;
}
结果:
12 12.1 12.12 12.1234请注意,与f 格式说明符不同,如果您在g 之前指定一个数字,则它指的是整个数字的长度(而不是@ 的小数位数987654325@)。
【讨论】:
%.2g,以便将其限制为小数点后两位。
f 格式说明符,数字表示十进制数字,但对于g,它是数字的总长度。
sprintf(temp, "%f", f); temp2 = strchr(temp, '.'); i = temp2-temp; printf(%.*g\n", (i+2), f); 之类的东西,但我不知道这是否真的有效。我想我会去试试看。
%g 的不好之处在于它可能会截断数字并且您会失去精度,例如printf("%g", 1363262708.988428) 会给您1.36326e+09,但是使用%f 它会打印正确(确切地说是1363262708.988428)。
"%.14g" 而不仅仅是"%g" 来解决(我不认为数字14 太重要;这是我在Lua 的源代码中找到的)。
根据我们在上述答案中的讨论,我的程序适用于小数点前的任意位数。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
float f1 = 12.13;
float f2 = 12.245;
float f3 = 1242.145;
float f4 = 1214.1;
int i = 0;
char *s1 = (char *)(malloc(sizeof(char) * 20));
char *s2 = (char *)(malloc(sizeof(char) * 20));
sprintf(s1, "%f", f1);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f1);
sprintf(s1, "%f", f2);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f2);
sprintf(s1, "%f", f3);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f3);
sprintf(s1, "%f", f4);
s2 = strchr(s1, '.');
i = s2 - s1;
printf("%.*g\n", (i+2), f4);
free(s1);
free(s2);
return 0;
}
这是输出
12.13
12.24
1242.15
1214.1
【讨论】:
对于它的价值,这是一个简单的 ObjC 实现:
// Usage for Output 1 — 1.23
[NSString stringWithFormat:@"%@ — %@", [self stringWithFloat:1],
[self stringWithFloat:1.234];
// Checks if it's an int and if not displays 2 decimals.
+ (NSString*)stringWithFloat:(CGFloat)_float
{
NSString *format = (NSInteger)_float == _float ? @"%.0f" : @"%.2f";
return [NSString stringWithFormat:format, _float];
}
%g 不是为我做的——这个是的 :-) 希望它对你们中的一些人有用。
【讨论】: