Подтвердить что ты не робот

Используйте printf для форматирования поплавков без десятичных знаков, если только завершение 0s

Можно ли форматировать float на C, чтобы отображать только до двух знаков после запятой, если они отличаются от 0s с помощью printf?

Пример:

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

4b9b3361

Ответ 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, оно обозначает длину всего числа (а не число десятичных знаков, как в случае f).

Ответ 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 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 не делал этого для меня - это один да:-) Надеюсь, это полезно для некоторых из вас.