我需要使用以下格式要求打印浮点数:
5.12345
应仅显示5.1
5.0
只应5
(不含.0
)
5.0176
应仅显示5
(不含.01
)
我认为printf()
可以做这样的事情......但现在我似乎无法让它发挥作用。
答案 0 :(得分:8)
您可以使用“%g”
获得您想要的结果#include <stdio.h>
int main(int argc, char* argv[])
{
printf("%.6g\n", 5.12345f);
printf("%.6g\n", 5.0f);
printf("%.6g\n", 5.0176f);
return 0;
}
输出:
5.12345
5
5.0176
“%g”将删除尾随零。
答案 1 :(得分:2)
听起来你想要打印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);
}
答案 2 :(得分:1)
不是你描述的方式,不是。如果你想要条件小数位,你必须自己做。
已经有一段时间了,因为我已经破解了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 - &gt;为什么?因为5.1并不能完全代表(在我的机器上)作为浮点数 - 它是5.09999而且还有一些更改。
你有机会了解floor()和ceil()......
答案 3 :(得分:1)
printf()可以使用格式化字符串。查看格式化字符串的宽度和精度选项:
printf("%.1f", 5.12345f);
这将打印5.1
。
不幸的是,它无法在没有指导的情况下自动确定要显示的内容。 (例如,我的最后一个选项对我来说不清楚 - 为什么它会丢弃“.0176”,而你没有告诉它你想要没有小数点?)
答案 4 :(得分:1)
没有任何格式化运算符支持此功能,但您可以首先过滤float
到sprintf()
,然后在适当的位置截断字符串。这样可以省去将浮点数转换为字符串的麻烦,其余的逻辑也很简单。
答案 5 :(得分:0)
你可以告诉printf在'。'之后打印指定的位数。 ,但是如果你想根据你必须编写代码的值来区分格式,以区分对你感兴趣的案例。