Используйте printf для форматирования чисел без десятичных разрядов, если только конечные 0 - PullRequest
36 голосов
/ 09 марта 2012

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

Ex:

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

Ответы [ 3 ]

52 голосов
/ 09 марта 2012

Вы можете использовать спецификатор формата %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, оно относится к длине всего числа (а не к числу десятичных знаков, как с * 1012). *).

7 голосов
/ 09 марта 2012

Из нашего обсуждения в ответе выше приведена моя программа, которая работает с любым количеством цифр до десятичной дроби.

#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
6 голосов
/ 07 сентября 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...