Möglicher Bruchverlust

119

Verzeihen Sie mir, wenn dies eine naive Frage ist, aber ich bin heute ratlos.

Ich habe eine einfache Divisionsberechnung wie folgt:

double returnValue = (myObject.Value / 10);

Wert ist ein int im Objekt.

Ich erhalte eine Nachricht mit der Aufschrift Möglicher Verlust von Brüchen. Wenn ich jedoch das Double in ein Int ändere, verschwindet die Nachricht.

Irgendwelche Gedanken darüber, warum dies passieren würde?

CodeLikeBeaker
quelle
Vielen Dank für die tollen Antworten. Es ist jetzt sinnvoll, dass Sie den Dezimalpunkt verlieren, wenn Sie 2 int-Werte teilen.
CodeLikeBeaker

Antworten:

168

Wenn Sie zwei Ints in einen Gleitkommawert teilen, geht der Bruchteil verloren. Wenn Sie eines der Elemente in einen Float umwandeln, wird dieser Fehler nicht angezeigt.

Machen Sie zum Beispiel aus 10 eine 10.0

double returnValue = (myObject.Value / 10.0);
Ólafur Waage
quelle
57

Sie führen eine Ganzzahldivision durch, wenn myObject.Valuees sich um ein Int handelt, da beide Seiten vom /Typ Ganzzahl sind.

Um eine Gleitkommadivision durchzuführen, muss eine der Zahlen im Ausdruck vom Gleitkommatyp sein. Das wäre wahr, wenn myObject.Value ein Double oder eines der folgenden wäre:

double returnValue = myObject.Value / 10.0;
double returnValue = myObject.Value / 10d; //"d" is the double suffix
double returnValue = (double)myObject.Value / 10;
double returnValue = myObject.Value / (double)10;
lc.
quelle
7

Eine durch eine Ganzzahl geteilte Ganzzahl gibt eine Ganzzahl zurück. Wirf entweder den Wert auf ein Doppel oder dividiere durch 10,0.

Kambium
quelle
7

Unter der Annahme, dass dies myObject.Valueeine ist int, ist die Gleichung myObject.Value / 10eine ganzzahlige Division, die dann in ein Doppel umgewandelt wird.

Das bedeutet, dass myObject.Value mit 12 dazu führt, dass returnValue 1 und nicht 1,2 wird.

Sie müssen zuerst die Werte umwandeln:

double returnValue = (double)(myObject.Value) / 10.0;

Dies würde zu dem korrekten Wert 1.2 führen, der mindestens so korrekt ist, wie es Doppel aufgrund ihrer Einschränkungen zulassen, aber das wird an anderer Stelle auf SO fast endlos diskutiert :-).

paxdiablo
quelle
4

Ich denke, da myObject ein int ist, sollten Sie

double returnValue=(myObject.Value/10.0); 
Segfault
quelle