2012-03-27 10 views
5

Ich bin Anfänger in C# und arbeite mit Gleitkommazahlen. Ich muss zwischen diesen beiden Zahlen subtrahieren, aber es funktioniert nicht. Ich weiß, dass es durch die Fließkommazahl verursacht wird, aber wie kann ich es reparieren, und wenn du so gut bist, kannst du mir erklären, warum es passiert? Danke im Voraus.C# falsche Subtraktion? 12.345 - 12 = 0.345000000000001

+0

Was Sie wollen und was ist Ihr Problem, bitte erarbeiten Sie Ihre Frage ..? –

+3

Poste bitte deinen Code. Sind alle Variablen schwebend? – c0d3Junk13

+4

Können Sie Code eingeben? Die Berechnung in Ihrem Thema sieht sehr seltsam aus. Die normale Fließkomma-Rundung verursacht kein solches Verhalten. – CodesInChaos

Antwort

7

Betrachten wir statt Schwimmer mit dezimal:

// Instead of this... 
float a = 12.345F; 
float b = 12; 
float c = a - b; 

// Use this: 
decimal d = 12.345M; 
decimal e = 12; 
decimal f = d - e; 

Jon Skeet gibt eine gute Erklärung für die Unterschiede zwischen den beiden Typen in dieser Antwort: https://stackoverflow.com/a/618596/446681

+0

+1: Wenn Sie irgendeine Art von numerischer Wiedergabetreue benötigen, ist "dezimal" der richtige Weg. – code4life

+0

Dezimal ist, was ich gesucht habe, vielen Dank. Ich möchte auch Leuten danken, die erklärt haben, warum es passiert ist. – c0ntrol

+0

Hängt davon ab, wofür die Nummern sind. Sie sollten immer "Dezimal" für Geld verwenden. Aber * nicht * für Physiksimulationen. – dan04

3

Wie genau berechnen Sie?

 float a = 12.35F; 
     float b = 12.0F; 
     float ans = a - b; //0.350000381 

     double x = 12.35; 
     double y = 12.0; 
     double ans2 = x - y; //0.34999999999999964 

     decimal n = 12.35m; 
     decimal m = 12.0m; 
     decimal ans3 = n - m; //0.35 

Für mich liefern diese Berechnungen die richtigen Ergebnisse.

+0

Danke für Dezimal . – c0ntrol

0

Je was Sie Sie entweder dezimal Typ verwenden können, oder speichern Sie es wie es ist, aber rund vor der Anzeige der Antwort

1

Denken Sie daran, dass das Verhalten der Gleitkommawerte abhängig von dem Prozessor variieren kann, den Sie verwenden.

Here ist eine Frage auf diesem Forum, das sich mit dem Thema

Wenn Sie wirklich in das Thema wollen graben beschäftigt, here ist eine gute Quelle, wie das Verhalten von Gleitkommazahlen

5

dies zu untersuchen ist kein aC# -Problem, das ist ein Informatikproblem. Wenn Sie wirklich verstehen wollen, was vor sich geht, lesen Sie What Every Computer Scientist Should Know About Floating-Point Arithmetic. Wenn Sie nur daran interessiert sind, warum Sie das Problem haben, liegt das daran, dass Float und Double auf dieser Plattform nur auf 7 bzw. 15 Stellen genau sind und Sie eine Rundungslogik anwenden müssen, um das gewünschte Ergebnis zu erzielen.

Float C# reference

Double C# reference

Squeezing unendlich vielen reellen Zahlen in eine endliche Anzahl von Bits erfordert eine ungefähre Darstellung. Obwohl es unendlich viele Ganzzahlen gibt, kann in den meisten Programmen das Ergebnis von Ganzzahlberechnungen in 32 Bits gespeichert werden. Im Gegensatz dazu ergeben die meisten Berechnungen mit reellen Zahlen bei gegebener fester Anzahl von Bits Mengen, die mit diesen vielen Bits nicht exakt dargestellt werden können. Daher muss das Ergebnis einer Gleitkommaberechnung oft in der Reihenfolge gerundet werden, um wieder in seine endliche Darstellung zu passen. Dieser Rundungsfehler ist das charakteristische Merkmal der Gleitkommaberechnung. Goldberg 1991

+0

Danke für die Erklärung. – c0ntrol