【问题标题】:Use printf to format floats without decimal places if only trailing 0s如果仅尾随 0,则使用 printf 格式化不带小数位的浮点数
【发布时间】: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

【问题讨论】:

标签: c printf


【解决方案1】:

您可以使用%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)。
  • @ivanzoid:这个问题可以通过使用"%.14g" 而不仅仅是"%g" 来解决(我不认为数字14 太重要;这是我在Lua 的源代码中找到的)。
【解决方案2】:

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

#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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多