C 如果只有尾随0,则使用printf格式化不带小数点的浮点

C 如果只有尾随0,则使用printf格式化不带小数点的浮点,c,printf,C,Printf,如果与使用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

如果与使用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;
}
#包括
int main(){
浮点数f1=12;
浮动f2=12.1;
浮点数f3=12.12;
浮点数f4=12.1234;
printf(“%g\n”,f1);
printf(“%g\n”,f2);
printf(“%g\n”,f3);
printf(“%g\n”,f4);
返回0;
}
结果:

12 12.1 12.12 12.1234 12 12.1 12.12 12.1234
请注意,与
f
格式说明符不同,如果在
g
之前指定一个数字,则它表示整个数字的长度(而不是
f
的小数位数)

根据我们在上述答案中的讨论,这里是我的程序,它适用于小数点之前的任意位数

#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;
}

值得一提的是,这里有一个简单的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不是为我做的-这一个是:-)希望它对你们中的一些人有用。

相关:您仍然希望
%.2g
限制在小数点后2位。顺便说一下,对于
f
格式说明符,数字代表小数位数,但是对于
g
来说,这是数字的总长度。哇,这似乎是一个复杂的原因。我想的是类似于sprintf(temp,%f),f;temp2=strchr(temp,’);i=温度2;printf(%.*g\n“,(i+2),f);但我不知道这是否真的有效。我想我会去试试。不幸的是,
%g
的不好之处在于它可能会截断数字,并且会丢失精度,例如
printf(“%g”,1363262708.988428)
将为您提供
1.36326e+09
,但是使用
%f
它将正确打印(准确地说是
1363262708.988428
)。@ivanzoid:这个问题可以通过使用
“%.14g”
而不是仅仅使用
“%g”
(我认为数字14并不太重要;这是我在Lua的源代码中发现的)。
// 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];
}