Frage

Ich habe hier ein seltsames Problem.Ich habe eine Datenbanktabelle, in der in einer Spalte ein großer Wert gespeichert ist.Meine Anwendung (C#) liest diesen Wert und behält ihn in einem doppelt Typ.Diese Anwendung fügt denselben Wert in eine andere Tabelle ein.Notiz :Ich führe keine Berechnungen/Verarbeitungen für den aus der ersten Tabelle gelesenen Wert durch.Es wird nur zum Aktualisieren der zweiten Tabelle aufbewahrt.

Das Problem hierbei ist, dass die zweite Tabelle einen etwas anderen Wert erhält als die erste Tabelle.Es sieht so aus, als ob die Zahl abgerundet wird, wenn ich die Doppelschrift beibehalte.

Hier ist ein Beispiel für Werte.

Originalwert : 18014398509481984

Wert in neue Tabelle kopiert: 18014398509482000

Die Werte sehen unterschiedlich aus, aber in Wirklichkeit sind beide gleich.Ich habe eine Google-Suche durchgeführt mit 18014398509481984 - 18014398509482000 als Suchbegriff eingegeben und es wurde ein Ergebnis zurückgegeben 0, was bedeutet, dass beide gleich sind.

Fragen:

1 – Wenn beide gleich sind, warum sieht der zweite Wert anders aus?ich kann sehen 1984 wurde zu 2000.

2 – Warum findet die Konvertierung statt?

3 – Wie kann ich diese Art von Konvertierungen vermeiden?

Jede Hilfe wäre großartig!

War es hilfreich?

Lösung

Versuchen Sie, einen System.Decimal mit dem Wert aus der ersten Tabelle zu speichern, statt einem System.Double. System.Double scheint nicht genug signifikante Stellen enthalten, die genau einen Wert groß zu speichern.

Andere Tipps

Ein Wert mit doppelter Genauigkeit ist nur auf 15 oder 16 Dezimalstellen genau (siehe Hier für eine Erklärung).Wenn Sie mehr als diese Zahl speichern müssen, müssen Sie ein anderes Zahlenformat verwenden.Wenn Sie mit sehr großen ganzen Zahlen arbeiten möchten, ohne an Genauigkeit zu verlieren, stehen Ihnen verschiedene Klassen zur Verfügung Dieses hier.

Wenn Sie einen Wert aus SQL erhalten, stellen Sie sicher, dass Ihr Zieldatentyp in .NET übereinstimmt – beispielsweise SQL bigint für C# long –, um solche Rundungsprobleme zu vermeiden.

Ich glaube, dies zu Gleitkommagenauigkeit zurückzuführen ist (die große Zahl einen Mantisse einen Exponenten verwenden), was bedeutet es im wesentlichen als fraktionellen Zahl mit einer Leistung dargestellt werden würde. Bruchzahlen jedoch Rundungsfehler auftreten aufgrund Gleitkomma-Arithmetik.

Normalerweise rundet dies der richtige Weg ist Gleitkommazahlen zu vermeiden (versuchen Int64), verwendet, um eine präzisere Art (dezimal) oder Konto für den Fehler und führen Sie ein ‚ca. gleich‘.

Haben Sie diese als Gleitkommazahlen speichern müssen?

Wenn nicht, dann könnten Sie 64-Bit-Integer statt: BIGINT in der Datenbank und long / Int64 in Ihrer Anwendung.

Diese haben eine Reichweite von bis zu -9.223.372.036.854.775.808 9.223.372.036.854.775.807 und keine Präzision / Genauigkeit Probleme.

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