C Fließkommazahl in Int umwandeln

Lesezeit: 6 Minuten

Benutzeravatar von AO
AO

Ich benutze C (nicht C++).

Ich muss eine Gleitkommazahl in eine umwandeln int. Ich möchte nicht auf die nächste Zahl runden, ich möchte einfach eliminieren, was nach dem ganzzahligen Teil steht. Etwas wie

4.9 -> 4.9 -> 4

  • Genug vom Haarschnitt – es ist nur ein Gips, den Sie brauchen

    – Ed heilen

    13. Juli 2014 um 13:30 Uhr

  • Ich verstehe nicht, was Sie mit “konvertieren” meinen int zu einer Binärzahl“—int schon ist Binär… Oder meinst du, es in einen String der binären Darstellung umzuwandeln, zB convert 14 zu "1110". So oder so: Wie kamen die Fließkommazahlen in diese Umwandlung?

    – Mafso

    13. Juli 2014 um 13:34 Uhr

  • Nach dem Lesen der Antwort von Benutzer 3195614: Vielleicht kommt die Verwirrung von der ganzzahligen Division, die zu ganzen Zahlen auswertet? 5 / 2 wertet zu 2 in C, nicht zu 2.5.

    – Mafso

    13. Juli 2014 um 13:40 Uhr

  • Alles, was einen Dezimalpunkt hat, wird als Float oder größer behandelt. Der Weg, um den Wert zu erhalten, ist entweder die lib-Funktion int floor(float) oder (zum Aufrunden) int ceil(float).

    – Benutzer3629249

    14. Juli 2014 um 4:17 Uhr

my_var = (int)my_var;

So einfach ist das. Grundsätzlich brauchen Sie es nicht, wenn die Variable int ist.

  • Wirklich danke! Es funktionierte! Entschuldigung, wenn die Frage zu einfach war, ich bin ein Neuling in c …

    – AO

    13. Juli 2014 um 13:44 Uhr

  • Stellen Sie sicher, dass Sie bei negativen und großen Zahlen tun, was Sie wollen/sollten. Die Dinge können komplizierter sein. Wenn die Floats positiv und kleiner als die maximale Ganzzahl auf Ihrer Plattform sind, sind Sie sicher.

    – Jakob

    13. Juli 2014 um 14:25 Uhr

  • Das ist nett, aber es ist auch ein undefiniertes Verhalten.

    – saolof

    21. August 2019 um 14:49 Uhr

Benutzeravatar von user3161739
Benutzer3161739

Verwendung in C

int C = var_in_float;

Sie werden implizit konvertiert

  • Einfach und kurz

    – Viraj Mohite

    5. April um 11:24 Uhr

Benutzeravatar von AdriZ
AdriZ

Wenn Sie es nach unten runden möchten, werfen Sie es einfach.

float my_float = 42.8f;
int my_int;
my_int = (int)my_float;          // => my_int=42

Wenn Sie es für andere Zwecke auf den nächsten Wert runden möchten, können Sie eine kleine Funktion oder eine Definition wie folgt erstellen:

#define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))

float my_float = 42.8f;
int my_int;
my_int = FLOAT_TO_INT(my_float); // => my_int=43

Seien Sie vorsichtig, idealerweise sollten Sie überprüfen, ob Float zwischen INT_MIN und INT_MAX liegt, bevor Sie es wirken.

  • Die Verwendung von Makros mit Logik ist nicht besonders schlau, da die Leute sie eher als Funktionen betrachten. Zum Beispiel, wenn Sie es tun würden FLOAT_TO_INT(rand()) es würde sich seltsam verhalten, es wäre besser, es zu einer Funktion zu machen

    – Laden Sie Pizza herunter

    18. Mai 2020 um 15:29 Uhr

  • bezüglich: #define FLOAT_TO_INT(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5)) Diese Literale 0.5 ist ein double Du willst wirklich float. Vorschlag: `#define FLOAT_TO_INT(x) ((x)>=0.0f?(int)((x)+0.5f):(int)((x)-0.5f))

    – Benutzer3629249

    27. August 2020 um 3:11 Uhr

  • “Abrunden nach unten” ist bei negativen Werten falsch/unklar. (int) kürzt den Bruch.

    – chux – Wiedereinsetzung von Monica

    27. August 2020 um 9:05 Uhr

  • @ user3629249 (x)+0.5f kann falsche gerundete Ergebnisse liefern, wenn die Summe ungenau ist. (x)+0.5 vermeidet dies, indem Sie breiter verwenden double Mathematik. IAK lroundf(), roundf() ist besser.

    – chux – Wiedereinsetzung von Monica

    27. August 2020 um 9:08 Uhr

Benutzeravatar von Legu
Legu

double a = 100.3;
printf("%f %d\n", a, (int)(a* 10.0));

Output Cygwin 100.3 1003
Output MinGW: 100.3 1002

Die Verwendung von (int) zum Konvertieren von double in int scheint nicht ausfallsicher zu sein

Mehr dazu findest du hier: Double in int umwandeln?

Benutzeravatar von Tomi Ollila
Tomi Ollila

Guter Gast! — wo ich noch keine zufriedenstellende Antwort für meinen Fall gefunden habe, funktioniert die Antwort, die ich hier gebe, für mich, ist aber möglicherweise nicht zukunftssicher …

Wenn man gcc (clang?) verwendet und hat -Werror und –Wbad-function-cast definiert,

int val = (int)pow(10,9);

ergibt:

error: cast from function call of type 'double' to non-matching type 'int' [-Werror=bad-function-cast]

(Aus gutem Grund muss über Überlauf und wo Werte gerundet werden nachgedacht werden)

BEARBEITEN: 30.08.2020: Also, mein Anwendungsfall wandelt den Wert von der Funktion, die double in int zurückgibt, und wählte pow(), um dies irgendwo anstelle einer privaten Funktion darzustellen. Dann habe ich mehr pow() gedacht. (Siehe Kommentare, warum die Verwendung von pow() unten problematisch sein könnte …).

Nach richtig durchdacht (dass die Parameter für pow() gut sind), int val = pow(10,9); scheint mit gcc 9.2 x86-64 zu funktionieren …

aber beachten:

printf("%d\n", pow(10,4));

kann zB ausgeben

-1121380856

(für mich getan) wo

int i = pow(10,4); printf("%d\n", i);

gedruckt

10000

in einem bestimmten Fall habe ich es versucht.

  • pow gibt ein Double zurück, deshalb können Sie es nicht mit drucken %d. Und die Verwendung von pow für diesen Zweck ist falsch, da es falsche Ergebnisse für ganze Zahlen zurückgeben kann. Verwenden Sie stattdessen 1e4, um 10^4 zu erhalten. Siehe Warum gibt der gcc-Compiler pow(10,2) als 99 und nicht 100 aus?, Warum pow(10,5) = 9.999 in C++, Warum wird pow(5,2) zu 24?

    – phuklv

    27. August 2020 um 3:05 Uhr

  • Oh, dieses (int)14e war großartig. Ist es sicher? 1e4 ohne Casting hat den Typ ‘double’ (wie im Fall von pow())

    – Tomi Ollila

    29. August 2020 um 21:09 Uhr


  • Verlorene Änderung zum Bearbeiten des obigen Kommentars mehr – erst kürzlich hatte ich einen Anwendungsfall für 1e6aber (wie üblich) habe ich verwendet printf("%d\n", 1e6); um es auszuprobieren und bekam seltsame Ergebnisse. wenn const int million = 1e6 gefunden wird, fange ich an, ein solches Format zu verwenden.

    – Tomi Ollila

    29. August 2020 um 21:32 Uhr

  • 1e6 verlässt sich auf den Compiler, um eine Qualität zu erstellen double zu int Wandlung. Weniger wahrscheinlich ein Problem als pow(), aber ich sehe keine C-Spezifikation, die die beste Antwort garantiert. Alternativen zu (int)1e6: Warum 1.000.000.000 als 1000*1000*1000 in C schreiben? und warum nicht sicher

    – chux – Wiedereinsetzung von Monica

    29. August 2020 um 22:31 Uhr


  • Jawohl pow() ist schlecht, im Vergleich zu 10e4 in diesem Beispiel (muss repariert werden, mit edit commit). Ich fragte mich, warum das 10e4 ist double nicht intdann probiert 1.12e1 und 12e-3 verstehen.

    – Tomi Ollila

    31. August 2020 um 15:11 Uhr

  • pow gibt ein Double zurück, deshalb können Sie es nicht mit drucken %d. Und die Verwendung von pow für diesen Zweck ist falsch, da es falsche Ergebnisse für ganze Zahlen zurückgeben kann. Verwenden Sie stattdessen 1e4, um 10^4 zu erhalten. Siehe Warum gibt der gcc-Compiler pow(10,2) als 99 und nicht 100 aus?, Warum pow(10,5) = 9.999 in C++, Warum wird pow(5,2) zu 24?

    – phuklv

    27. August 2020 um 3:05 Uhr

  • Oh, dieses (int)14e war großartig. Ist es sicher? 1e4 ohne Casting hat den Typ ‘double’ (wie im Fall von pow())

    – Tomi Ollila

    29. August 2020 um 21:09 Uhr


  • Verlorene Änderung zum Bearbeiten des obigen Kommentars mehr – erst kürzlich hatte ich einen Anwendungsfall für 1e6aber (wie üblich) habe ich verwendet printf("%d\n", 1e6); um es auszuprobieren und bekam seltsame Ergebnisse. wenn const int million = 1e6 gefunden wird, fange ich an, ein solches Format zu verwenden.

    – Tomi Ollila

    29. August 2020 um 21:32 Uhr

  • 1e6 verlässt sich auf den Compiler, um eine Qualität zu erstellen double zu int Wandlung. Weniger wahrscheinlich ein Problem als pow(), aber ich sehe keine C-Spezifikation, die die beste Antwort garantiert. Alternativen zu (int)1e6: Warum 1.000.000.000 als 1000*1000*1000 in C schreiben? und warum nicht sicher

    – chux – Wiedereinsetzung von Monica

    29. August 2020 um 22:31 Uhr


  • Jawohl pow() ist schlecht, im Vergleich zu 10e4 in diesem Beispiel (muss repariert werden, mit edit commit). Ich fragte mich, warum das 10e4 ist double nicht intdann probiert 1.12e1 und 12e-3 verstehen.

    – Tomi Ollila

    31. August 2020 um 15:11 Uhr

1397840cookie-checkC Fließkommazahl in Int umwandeln

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

Privacy policy