2009-03-05 14 views
4

erwartete Ich habe folgende in einem Programm (Teil einer viel größeren Funktion, aber dies ist der relevante Test Bit):C mathematische Berechnung arbeitet nicht als

int test = 100 + (100 * (9/100)); 
sprintf (buf, "Test: %d\n\r", test); 
display_to_pc (buf, player); 

Grundsätzlich sie beträgt:

x = a + (a * (b/100)) 

Wo a ist eine gegebene Zahl, b ist ein Prozentsatz Modifikator, und x ist das Ergebnis (das Original plus ein Prozentsatz des Originals) ... Ich hoffe, dass es Sinn macht.

Es gibt mir:

Test: 100 

Ich dachte, die Mathematik in meinem Kopf falsch sein könnte, aber ich habe mehrere Rechner und sogar die Ausdrucksauswertung in meinen IDE überprüft, und sie alle geben mir das erwartete Ergebnis von 109 für den ersten Ausdruck.

Kann mir jemand aufklären, was ich hier vermisse?

Vielen Dank. :)

+0

Verwenden Sie Arithmetik innerhalb nur ganze Zahlen und Sie sollten sehen, wie dies zu diesem Ergebnis, z. Denken Sie darüber nach, wie oft 100 in 9 als ganze Zahlen, nicht als Brüche, eingehen. –

Antwort

14

Ersetzen

int test = 100 + (100 * (9/100)); 

mit

int test = 100 + (100 * 9/100); 
// x = a + (a * b/100) 

und es wird wie erwartet funktionieren. 9/100 wird unter Verwendung einer Ganzzahldivision durchgeführt; die nächste ganze Zahl zu .09 ist 0 (und 0 * 100 ist immer noch 0).

Die Multiplikation erste Ergebnisse in 900/100, die gibt Ihnen die 9, die Sie erwartet haben.

Wenn Sie mehr als ganzzahlige Genauigkeit benötigen, müssen Sie möglicherweise die Gleitkomma-Route verwenden.

+0

Ich denke, es wäre besser, wenn Sie eine explizite Umwandlung oder eine Gleitkommakonstante ausführen, da abhängig von der Reihenfolge der Auswertung der Code bricht, wenn Sie den Code umgestalten. Eine explizite Besetzung warnt den nächsten Programmierer (wer könnte es sein), dass dies ein Fließkomma-Punkt sein muss. – tvanfosson

+0

Ich weiß es nicht; Ich habe "Multiplizieren vor dem Teilen" -Skalieren (offensichtlich für Zahlen, die nicht überlaufen werden) so lange gemacht, dass es mir ziemlich natürlich erscheint; Ich versuche, nicht in FP zu kommen, wenn ich es vermeiden kann. Ich stimme zu, dass Vorsicht in diesem Fall klug ist. –

+0

@tvanfosson: Wenn jemand die Reihenfolge der Operationen ändert, ändert sich das Verhalten des Codes. Niemand wird das tun und erwarten, dass es genauso funktioniert. Und es muss nicht Fließkomma sein ... manchmal wollen Sie Ganzzahlmathematik, und das sieht wie eine dieser Zeiten aus. – rmeador

3

int test = 100 + (100 * (9/100));

9/100 = 0

0 * 100 = 0

100 + 0 = 100

1

Die Antwort von 9/10 auf 0 abgeschnitten wird, und dann multiplizieren Sie das mit 100, und dann füge 100 hinzu.

8

Sie verwenden Ganzzahlmathematik.

9/100 = 0.

100 + (100 * (0) = 100.

Ihr Rechner verwenden Gleitkomma-Mathematik und Dezimalzahlen in geeigneter Weise umgehen kann.

2

Sie integer verwenden Teilung so 9/100 Null so test = 100 + 0 = 100

3

Ihr Fehler ist, dass 9/100 als ganzzahlige Division interpretiert wird und zu 0 und nicht zu 0,09 ausgewertet wird.

Sie können 9/100 schreiben.0 stattdessen, oder den Ausdruck neu anordnen.

4

Wie andere darauf hingewiesen haben, ist das Problem, dass Sie Integer-Arithmetik durchführen. Sie müssen die Berechnung als Fließkomma ausführen, indem Sie die Variable auf eine doppelte oder eine doppelte Konstante umwandeln und dann zulassen, dass die Trunkierung nur den ganzzahligen Anteil ergibt.

x = a + (a * (b/100.0)); 

oder

x = a + (a * ((double)b/100))); 
1

Wechsel:

int test = 100 + (100 * (9/100)); 

zu

int test = (int)(100 + (100 * (9/100.0))); 

und sehen, ob es wie erwartet funktioniert.

EDIT: wow. Viele Antworten während ich tippte. Die meisten von ihnen werden auch funktionieren.

1

Sie sollten Fließkomma-Arithmetik verwenden, damit 9/100 zu 0,09 wird.

Int Test = 100,0 + (100,0 * 9,0/100,0);

2

Verwenden Sie die Antwort von Daniel L, wenn Sie nur mit Ausdrücken arbeiten, die ganzzahlige Ganzzahlen ergeben. Wenn die Werte Sie mit arbeiten, weniger sauber sind, verwenden Sie doppelte Literale statt Ganzzahlliterale:

int test = 100.0 + (100.0 * (9.0/100.0)); 
0

Sie ganze Zahlen für Ihre Variablentypen verwenden, so dass der innerste Ausdruck (9/100) führt in mit Schwimmer versucht stattdessen ein 0. Dann wäre der nächste Ausdruck 100 * 0, sein, die 0, und schließlich 100 + 0 ...

Ihr gewünschtes Ergebnis zu erhalten:

Schwimmertest = 100,0 + (100,0 * (9,0/100,0));

printf ("Ergebnis:% 0,2f \ n", Test);

Verwandte Themen