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
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
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
Benutzer3161739
Verwendung in C
int C = var_in_float;
Sie werden implizit konvertiert
Einfach und kurz
– Viraj Mohite
5. April um 11:24 Uhr
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
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?
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 1e6
aber (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 int
dann 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 1e6
aber (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 int
dann probiert 1.12e1
und 12e-3
verstehen.
– Tomi Ollila
31. August 2020 um 15:11 Uhr
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 convert14
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 zu2
in C, nicht zu2.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