Verwenden Sie printf, um Floats ohne Dezimalstellen zu formatieren, wenn nur abschließende Nullen vorhanden sind

Lesezeit: 3 Minuten

Ist es möglich, einen Float in C so zu formatieren, dass er nur bis zu 2 Dezimalstellen anzeigt, wenn er sich von 0 unterscheidet, indem er printf verwendet?

Ex:

12 => 12

12.1 => 12.1

12.12 => 12.12

Ich habe versucht mit:

float f = 12;
printf("%.2f", f)

aber ich bekomme

12 => 12.00

12.1 => 12.10

12.12 => 12.12

  • Siehe auch: stackoverflow.com/questions/277772/…

    – Mike Kwan

    9. März 2012 um 3:48 Uhr

Benutzeravatar von Mechanical_meat
mechanisches_fleisch

Du kannst den … benutzen %g Formatbezeichner:

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

Ergebnis:

12
12.1
12.12
12.1234

Beachten Sie, dass im Gegensatz zu f Formatbezeichner, wenn Sie eine Zahl vor dem angeben g es bezieht sich auf die Länge der gesamten Zahl (nicht die Anzahl der Nachkommastellen wie bei f).

  • die willst du noch haben %.2g so dass es auf 2 Dezimalstellen begrenzt ist.

    – twain249

    9. März 2012 um 4:00 Uhr

  • Übrigens für die f Formatbezeichner die Zahl repräsentiert Dezimalziffern, aber für g es ist die Gesamtlänge der Nummer.

    – mechanisches_Fleisch

    9. März 2012 um 4:11 Uhr


  • Wow, das scheint ein kompliziertes Warum zu sein. Ich dachte so etwas wie sprintf(temp, "%f", f); temp2 = strchr(temp, '.'); i = temp2-temp; printf(%.*g\n", (i+2), f); aber ich weiß nicht ob das wirklich geht. Ich denke, ich werde es versuchen.

    – twain249

    9. März 2012 um 4:22 Uhr

  • Was leider nicht gut ist %gist, dass es möglicherweise die Zahl abschneidet und Sie beispielsweise die Genauigkeit verlieren printf("%g", 1363262708.988428) werde dir geben 1.36326e+09jedoch mit %f Es wird korrekt gedruckt (genau 1363262708.988428).

    – ivanzoid

    14. März 2013 um 12:23 Uhr

  • @ivanzoid: Das Problem kann mit gelöst werden "%.14g" statt nur "%g" (Ich denke nicht, dass die Zahl 14 zu wichtig ist; das habe ich in Luas Quellcode gefunden).

    – Nicolo M.

    29. April 2014 um 13:14 Uhr

Aus unserer Diskussion in der obigen Antwort ist hier mein Programm, das für eine beliebige Anzahl von Ziffern vor dem Dezimalzeichen funktioniert.

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

Und hier ist die Ausgabe

12.13
12.24
1242.15
1214.1

Für das, was es wert ist, hier ist eine einfache ObjC-Implementierung:

// 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 hat es nicht für mich getan – dieses hier ja 🙂 Ich hoffe, es ist für einige von euch nützlich.

1403240cookie-checkVerwenden Sie printf, um Floats ohne Dezimalstellen zu formatieren, wenn nur abschließende Nullen vorhanden sind

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy