Frage

Ich sage immer in c # eine Variable vom Typ double-Leistungs-Verhältnis nicht geeignet ist. Alle seltsame Dinge passieren könnte. Aber ich kann nicht scheinen, um ein Beispiel zu erstellen, einige dieser Fragen zu demonstrieren. Kann so jemand gibt ein Beispiel?

(edit; Dieser Beitrag wurde ursprünglich getaggt C #, einige Antworten beziehen sich auf spezifische Details von decimal, die daher mittels System.Decimal ).

(edit 2: Ich war spezifisch für einen c # -Code zu fragen, so dass ich glaube nicht, das sprachunabhängig ist nur)

War es hilfreich?

Lösung

Sehr, sehr ungeeignet. Verwenden Sie dezimal.

double x = 3.65, y = 0.05, z = 3.7;
Console.WriteLine((x + y) == z); // false

(Beispiel von Jon Seite hier - zum Lesen empfohlen ;-P)

Andere Tipps

Sie werden seltsame Fehlermeldungen erhalten effektiv durch Rundung. Darüber hinaus Vergleiche mit genauen Werten sind extrem heikel - Sie müssen in der Regel eine Art von Epsilon gelten für den tatsächlichen Wert zu sein „in der Nähe“ ein bestimmte zu überprüfen

.

Hier ist ein konkretes Beispiel:

using System;

class Test
{
    static void Main()
    {
        double x = 0.1;
        double y = x + x + x;
        Console.WriteLine(y == 0.3); // Prints False
    }
}

Ja, es ist nicht geeignet.

Wenn ich richtig Doppel hat über 17 bedeutende Zahlen erinnern, so normalerweise Rundungsfehler Platz weit hinter dem Komma nehmen. Die meisten Finanz-Software verwendet 4 Dezimalstellen hinter dem Komma, das lässt 13 Dezimalstellen, mit arbeiten, so dass die maximale Zahl, die Sie mit für einzelne Operationen arbeiten können noch sehr viel höher als die USA Staatsschuld ist. Aber Rundungsfehler werden bis im Laufe der Zeit. Wenn Ihre Software für eine lange Zeit läuft werden Sie schließlich verlieren Cent beginnen. Bestimmte Operationen werden diese verschlimmern. Zum Beispiel das Hinzufügen großer Mengen zu geringen Mengen einen erheblichen Verlust an Genauigkeit führen.

Sie müssen feste Punkt-Datentypen für Geld Operationen, die meisten Leute haben nichts dagegen, wenn Sie einen Cent hier und da verlieren, aber Buchhalter sind nicht wie die meisten Menschen ..

Bearbeiten
Gemäß dieser Website http://msdn.microsoft.com/en-us/library /678hzkk9.aspx Doubles tatsächlich haben 15 bis 16 signifikante Stellen statt 17.

@ Jon Skeet dezimal ist besser geeignet als das Doppelte wegen seiner höheren Genauigkeit, 28 oder 29 signifikanten Dezimalstellen. Das bedeutet weniger Chancen akkumulierten Rundungsfehler immer signifikant. Festpunkt-Datentypen (dh ganze Zahlen, den Cent oder 100stel eines Cent darstellen, wie ich verwendet habe, zu sehen) wie Boojum erwähnt sind eigentlich besser geeignet.

Da decimal einen Skalierungsfaktor von Vielfachen von 10 verwendet, Zahlen wie 0,1 exakt dargestellt werden. Im Wesentlichen stellt der Typ decimal dies als 1/10 ^ 1, während ein double dies als 104857/2 ^ 20 (in Wirklichkeit darstellen würde es eher wie seine wirklich-big-Zahl / 2 ^ 1023).

A decimal kann genau repräsentieren jeden Basis 10 Wert mit bis zu 28/29 signifikanten Ziffern (wie 0.1). Ein double kann es nicht.

Mein Verständnis ist, dass die meisten Finanzsysteme ausdrücken Währung ganze Zahlen mit - d. H, alles in Cent zählen

IEEE double precision eigentlich kann repräsentieren alle ganzen Zahlen genau im Bereich -2 ^ 53 bis + 2 ^ 53. (Hacker Delight, pg. 262) Wenn Sie nur zusätzlich verwendet werden, Subtraktion und Multiplikation, und halten alles auf ganze Zahlen innerhalb dieses Bereichs, dann sollten Sie keinen Verlust an Präzision sehen. Ich wäre sehr vorsichtig mit der Teilung oder komplexere Operationen aber nicht.

Mit doppelt, wenn Sie nicht wissen, was Sie tun, ist nicht geeignet.

„double“ mit einem Fehler von 1 / 90th eines Cent einen Betrag von einer Billion Dollar darstellen. So werden Sie sehr präzise Ergebnisse. Möchten Sie berechnen, wie viel es einen Mann auf dem Mars setzen Kosten und ihn wieder am Leben? Doppel tut einfach gut.

Aber mit Geld gibt es oft sehr spezifische Regeln sagen, dass eine bestimmte Berechnung ein bestimmtes Ergebnis und keinen anderen geben müssen. Wenn Sie einen Betrag zu berechnen, die sehr sehr sehr nah an $ ist 98,135 dann wird es oft eine Regel sein, dass das Ergebnis sollte $ 98.14 oder $ 98.13 und Sie muss legt fest, ob dieser Regel folgen und das Ergebnis zu erhalten, die erforderlich ist .

Je nachdem, wo Sie leben, 64-Bit-Integer mit Cent oder ein paar Cent oder Kopeken darzustellen oder was auch immer ist die kleinste Einheit in Ihrem Land wird in der Regel gut funktionieren. Zum Beispiel signierten 64-Bit-Ganzzahlen, die Cent-Werte darstellen zu 92.223 Billionen Dollar. 32-Bit-Integer sind in der Regel nicht geeignet.

Nein ein Doppel wird immer Rundungsfehler, verwenden Sie „Dezimal“, wenn Sie auf .Net ...

Eigentlich Gleitkommazahlen double ist sehr gut geeignet, um Geldbeträge darstellen, solange Sie ein geeignetes Gerät auszuwählen.

Siehe http://www.idinews.com/moneyRep.html

So wird festPunkt lang . Entweder verbraucht 8 Bytes, sicherlich besser, die verbraucht 16 durch eine dezimal Element.

Unabhängig davon, ob etwas funktioniert (d ergibt das erwartete und richtiges Ergebnis) ist keine Frage von entweder Abstimmung oder individueller Vorlieben. Eine Technik, entweder funktioniert oder es funktioniert nicht.

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