C 正在获取printf()以删除尾随的";。0“;价值观
我需要按以下格式要求打印浮点数:C 正在获取printf()以删除尾随的";。0“;价值观,c,printf,C,Printf,我需要按以下格式要求打印浮点数: 5.12345应仅显示5.1 5.0只应5(不含.0) 5.0176应仅显示5(不显示.01) 我想printf()可以做这样的事情。。。但现在我似乎无法让它工作。不是你描述的方式,不。如果你想要有条件的小数位数,你必须自己做 我已经有一段时间没有使用printf格式了,但这在大多数情况下似乎都是有效的 char *BuildConditionalFormat(double val) { int tenths = (int)(val * 10) %
应仅显示5.12345
5.1
只应5.0
(不含5
).0
应仅显示5.0176
(不显示5
).01
我想
printf()
可以做这样的事情。。。但现在我似乎无法让它工作。不是你描述的方式,不。如果你想要有条件的小数位数,你必须自己做
我已经有一段时间没有使用printf格式了,但这在大多数情况下似乎都是有效的
char *BuildConditionalFormat(double val)
{
int tenths = (int)(val * 10) % 10;
if (tenths == 0)
return ".0f";
return ".1f";
}
/* test rig */
float f = 5.0;
printf(BuildConditionalFormat(f), f); /* -> 5 */
f = 5.13;
printf("\n");
printf(BuildConditionalFormat(f), f); /* -> 5.1 */
printf("\n");
这遵守了您的规则,但也将提供一个有趣的教训,说明为什么浮点会因为5.1->5而臭名昭著。为什么?因为5.1并没有干净地(在我的机器上)表示为一个浮动-它是5.09999,还有一些变化
您可能还需要了解floor()和ceil()。()可以使用格式化字符串。查看格式化字符串的宽度和精度选项:
printf("%.1f", 5.12345f);
这将打印5.1
不幸的是,它没有能力在没有指导的情况下自动确定要显示什么。(例如,我不清楚您在那里的最后一个选项-为什么它要删除“.0176”,而不告诉它您不需要小数点?您可以告诉printf在“.”之后打印指定数量的数字,但是,如果您想根据值来区分格式,则必须编写代码来区分感兴趣的情况。没有任何格式运算符支持这一点,但是您可以先通过
sprintf()
过滤浮点值
,然后在适当的情况下截断字符串。这就省去了将浮点值转换为字符串的麻烦,而完成其余操作的逻辑也很简单。使用“%g”可以获得接近所需结果的结果
“%g”将删除尾随的零。听起来像是要打印小数点后1位,如果该位为0,则将其删除。此功能应该可以正常工作:
// prints the float into dst, returns the number
// of chars in the manner of snprintf. A truncated
// output due to size limit is not altered.
// A \0 is always appended.
int printit(float f, char *dst, int max) {
int c = snprintf(dst, max, "%.1f", f);
if(c > max) {
return c;
}
// position prior to '\0'
c--;
while(dst[c] == '0') {
c--;
if(dst[c] == '.') {
c--;
break;
}
}
dst[c + 1] = '\0';
return c + 1;
}
int main(void) {
char num1[10], num2[10], num3[10];
printit(5.12345f, num1, 10);
printit(5.0f, num2, 10);
printit(5.0176f, num3, 10);
printf("%s\n%s\n%s\n", num1, num2, num3);
}
我想我们需要对你想要的结果进行更系统的描述。现在,您已经给出了几个示例,但我完全不确定您想要(比如)15.2的值。您希望最多显示两个有效数字,还是只显示在单位位置,或者具体显示什么?如果出现
5.06
,您希望显示什么?Printf可能会将其四舍五入到5.1
。是否要删除.1
?该文件的可能副本不会从5.0 fyi中删除.0,但如果为5.0,则会打印5.0。OP想在这种情况下打印5。@Dana:我不确定那是真的。看看OP的第一个选项-他们想要5.1代替5.12345-不涉及0…我想我应该展示一下使用printf的可能性-OP可以澄清这是否是预期的结果。@里德:它需要做所有这些情况,而不仅仅是第一个。%.2g
将通过OP的所有三个测试。@Max,我已经查看了手册页。如果他说%.2g
,然后打印100
,他得到1.00e+02
(如果指数大于或等于精度,则%g
使用科学风格)。我认为这可能不是他想要的。一个问题是,如果需要的话,它不容易支持舍入。在最初的帖子中,没有一个例子显示了任何需要舍入的内容,所以我们不知道这是否是一个要求。
5.12345
5
5.0176
// prints the float into dst, returns the number
// of chars in the manner of snprintf. A truncated
// output due to size limit is not altered.
// A \0 is always appended.
int printit(float f, char *dst, int max) {
int c = snprintf(dst, max, "%.1f", f);
if(c > max) {
return c;
}
// position prior to '\0'
c--;
while(dst[c] == '0') {
c--;
if(dst[c] == '.') {
c--;
break;
}
}
dst[c + 1] = '\0';
return c + 1;
}
int main(void) {
char num1[10], num2[10], num3[10];
printit(5.12345f, num1, 10);
printit(5.0f, num2, 10);
printit(5.0176f, num3, 10);
printf("%s\n%s\n%s\n", num1, num2, num3);
}