float mit double und int vergleichen c?


29.10.2022, 17:38

Lösung:

if bedingung muss geändert werden

if (einwurf != 0.05f && einwurf != 0.10f && einwurf != 0.20f && einwurf != 0.50f && einwurf != 1.0f && einwurf != 2.0f)

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

EDIT:
Auch ne, sorry, dein Problem ist, dass du in deiner ersten If-bedingung Verunden und nicht Verordern musst, damit es klappt.

Derzeit wertet deine If-Bedingung immer zu "true" aus.

MikeMoon 
Fragesteller
 29.10.2022, 15:45

hahah oh man danke. soo dumm. manchmal steht man echt aufm schlauch. danke dir jetzt klappt es.

1
MikeMoon 
Fragesteller
 29.10.2022, 15:51

jezt erkennt er 0.5 & 1 & 2 aber 0.10 & 0.20 erkennt er nicht ...woran kann das liegen?

1
Destranix  29.10.2022, 15:53
@MikeMoon

Printe dir einmal die Konstante und einmal deine Ausgabe mit allen Nachkommastellen aus und schau, ob das dasselbe ist.

Womöglich castest du davor irgendwie falsch oder die Werte können nicht dargestellt werden und werden unterschiedlich gerundet.

(Ich würde bei dieser Aufgabe im Übrigen sowieso lieber Integers verwenden und die als Cents interpretieren.)

0
MikeMoon 
Fragesteller
 29.10.2022, 16:01
@Destranix

ja ich sehe wenn ich 0.10 eingebe speichert er 0.10000004367 oder so ne scheiße ab

0
Destranix  29.10.2022, 16:02
@MikeMoon

Ja das ist soweit normal. Wichtig zu wissen wäre halt, ob es bei deiner Eingabe dasselbe abspeichert. Wenn ja sollte das ja dennoch vergleichbar sein.

0
MikeMoon 
Fragesteller
 29.10.2022, 16:05
@Destranix

ich gebe 0.10 ein in die variable "einwurf" wird 0.10000004357 gespeichert. aber einwurf und 0.10 in der if bedingung lassen sich nicht vergleichen, obwohl es vergleichbar sein müsste

0
Destranix  29.10.2022, 16:08
@MikeMoon

Printe dir doch mal noicht nur "einwurf" aus, sondern auch die Konstante 0.10 und schau, ob die gleich sind.
Wenn nicht, dann musst du entweder eine Vergleichsfunktion bauen, die mit einbezieht, das Floats ungenau sind, oder du musst Integers verwenden.

0
MikeMoon 
Fragesteller
 29.10.2022, 16:35
@Destranix

der einwurf wert wird beim vergleichen in -1610612736 geändert. deswegen der fehler

0
Destranix  29.10.2022, 16:36
@MikeMoon

Hast du den evtl. fälschlicherweise als Integer geprinted und nicht als Gleitkommazahl?

Wenn nicht, dann machst du irgendetwas grob falsch.

0
MikeMoon 
Fragesteller
 29.10.2022, 16:53
@Destranix

int main()

{

double test = scanf_s("%d", &test);

printf("%d", test);

if (test != 0.10)

printf("\t%d", test);

return 0;

}

ich gebe 0.10 ein und 0 wird ausgegeben. hab langsam kein bock mehr :D

1
Destranix  29.10.2022, 16:57
@MikeMoon

Der Forma-String "%d" scannt ein Integer, keine Gleitkomma-Zahl. Entsprechend wird er Wert schon beim Einlesen gerundet oder es geht ganz schief.

By the way der Syntax

double test = scanf_s("%d", &test);

ist wharscheinlich falsch, denn der Rückgabewert wird vermutlich die Zahl der gelesenen Zeichen sein und nicht der gelesene Wert.

Versuche mal folgendes:

double test;
scanf_s("%lf", &test);

und tausche den Format-String auch an den sonstigen Stellen aus.

1
MikeMoon 
Fragesteller
 29.10.2022, 17:03
@Destranix

Code:

int main()

{

float test;

scanf_s("%f", &test);

printf_s("%f", test);

if (test != 0.10)

printf_s("\t%f", test);

return 0;

}

Ausgabe :

0.10

0.100000    0.100000

wenn ich doch 0.10 eingebe dürfte er doch nicht die if bedingung ausführen....warum macht er das

1
Destranix  29.10.2022, 17:07
@MikeMoon

Deshalb printe dir einmal auf die Konstante aus mit voller Präzision.

Deine Konstante ist nämlich ein Double und hat deshalb eine höhere Präzision und rundet deshalb evtl bei 0.10 auf einen anderen Wert als dein float.

printf_s("%.*lf", test);
printf_s("%.*lf", 0.10);
printf_s("%.*lf", 0.10f);
1
Destranix  29.10.2022, 17:14
@MikeMoon

Ach ups, falscher Format-String. Versuch es mal mit

printf_s("%lf", test);
printf_s("%lf", 0.10);
printf_s("%lf", 0.10f);
1
MikeMoon 
Fragesteller
 29.10.2022, 17:18
@Destranix

float test;

scanf_s("%f", &test);

printf_s("%lf\n", test);

printf_s("%lf\n", 0.10);

printf_s("%lf\n\n", 0.10f);

if (test != 0.10) {

printf_s("%lf\n", test);

printf_s("%lf\n", 0.10);

printf_s("%lf\n", 0.10f);

}

printf_s("\t\n\n%f\n\n", test);

return 0;

0.10

0.100000

0.100000

0.100000

0.100000

0.100000

0.100000

0.100000

if bedingung wird immernoch ausgeführt

1
MikeMoon 
Fragesteller
 29.10.2022, 17:20
@Destranix

ich werde jetzt die 0,05 & 0,1 & 0,2 euto / cent stücke als variablen speichern, dann passiert das problem nicht mehr. is zwar kacke aber langsam is die luft raus ahah

0
Destranix  29.10.2022, 17:22
@MikeMoon

Oh mann, das regt mich echt auf dieser Format-String. Gibt immer noch nicht die richtige Präsision aus.

Internet sagt

printf_s("%.17g\n", test);
printf_s("%.17g\n", 0.10);
printf_s("%.17g\n", 0.10f);

Hoffentlich klappt es dieses Mal.

0
Destranix  29.10.2022, 17:23
@MikeMoon

Gibt bessere Lösungen (einfach ein 'f' hinter die Konstante, um die als Float zu kennzeichnen), aber ich wollte dir mit dem printf ja eigentlich zeigen, wo das Problem liegt.

0
Destranix  29.10.2022, 17:26
@MikeMoon

Ersteres. Aber mach noch einmal das printf, mit etwas glück siehst du dannd as Problem.

1
MikeMoon 
Fragesteller
 29.10.2022, 17:32
@Destranix

ah ok. ja sehe es. danke dir auf jeden fall. gut was gelernt. danke für deine zeit

1