Frage

Ich habe einen Code, und ich verstehe es nicht. Ich entwickle eine Anwendung, die Präzision ist sehr wichtig. aber es funktioniert nicht wichtig für .NET, warum? Ich weiß es nicht.

double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

aber das Meldungsfeld zeigt: 3.5 Bitte helfen Sie mir, Danke.

War es hilfreich?

Lösung

können Sie haben Genauigkeit, aber es hängt davon ab, was sonst wollen Sie tun. Wenn Sie die folgend in einer Konsolenanwendung setzen:

double a = 1e-20;
Console.WriteLine(" a  = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);

decimal b = 1e-20M;
Console.WriteLine(" b  = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);

Sie erhalten

 a  = 1E-20
1+a = 1
 b  = 0,00000000000000000001
1+b = 1,00000000000000000001

Aber Beachten Sie, dass die Pow Funktion, wie fast alles in der Klasse Math, nur verdoppelt nimmt:

double Pow(double x, double y);

So ermitteln Sie den Sinus einer Dezimalzahl nicht nehmen kann (andere dann durch deren Umwandlung zu verdoppeln)

Siehe auch diese Frage .

Andere Tipps

Wenn Sie etwas zu tun, wo Präzision sehr wichtig ist, müssen Sie sich bewusst die Grenzen der Floating-Point sein. Eine gute Referenz ist David Goldberg „Was jeder Informatiker wissen sollten über Gleitpunktarithmetik „.

Sie können feststellen, dass Gleitkommadaten nicht genügend Präzision nicht geben, und Sie müssen mit einem Dezimal-Typ arbeiten. Diese sind jedoch immer viel langsamer als Floating-Point - es ist ein Kompromiss zwischen Genauigkeit und Geschwindigkeit

.

Die Präzision eines Double beträgt 15 Stellen (17 Stellen intern). Der Wert, den Sie mit Math.Pow berechnen ist richtig, aber wenn Sie fügen Sie es value gerade ist zu klein, um einen Unterschied zu machen.

Edit:
Ein Dezimal kann diese Präzision handhaben, aber nicht die Berechnung. Wenn Sie diese Präzision wollen, müssen Sie die Berechnung tun, dann jeden Wert in einem Decimal konvertieren, bevor das Hinzufügen sie zusammen:

double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());

Nutzen Sie die Dezimal geben Sie eher als das doppelte.

doppelte Genauigkeit bedeutet es 15-16 Ziffern halten kann. 3,5 + 1e-20 = 21 Ziffern. Es kann nicht in Doppel precicion dargestellt werden. Sie können eine andere Art wie dezimal verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top