2016-08-08 36 views
-1

Ich kann nicht glauben, was passiert und ist so einfach, dieses Problem zu beweisen. Sie müssen nur den folgenden Code in eine Access-DB mit DAO ausführen.Probleme bei der Aktualisierung/Einfügen eines Feldes, das den Datentyp SINGLE

CREATE TABLE Table1(Field1 Single) 

INSERT INTO Table1 (Field1) VALUES(9.99) 

Dann

SELECT * FROM [Table1] 

das Ergebnis

Field1 ist = 9,98999977111816

Das ist eine große Sache ist, denn wenn man so etwas wie 2000 Zeilen einfügen und dann dieses Feld summieren, der Wert beginnt weit und weit von der erwarteten Summe der Werte entfernt zu sein.

Hinzufügen Weitere Informationen

Währung hat Feldgröße = 15 zu speichern, Single Feldgröße = 7 zu speichern, ich brauche Einzel zu verwenden, da die Speichergrenze für mich sehr wichtig ist.

Lösungen sind sehr gut. Spekulieren ist Zeit verlieren. Wahre verdiene keine Downstimmen.

Und was ist mit diesem Problem, hat jemand das gleiche Problem? Ist das ein dokumentiertes Problem? Reden wir über dieses Verhalten, wer ist mit mir?

+0

* "Hat jemand das gleiche Problem?" * Ja. Es ist einfach so, wie Fließkomma-Datentypen (Single, Double) in * jedem * Kontext funktionieren, nicht nur Access. * "Ist das ein dokumentiertes Problem?" * Ja: [Ist die Fließkomma-Mathematik kaputt?] (Http://stackoverflow.com/q/588004/2144390) –

+0

das, worüber ich spreche! ich danke dir sehr! Es tut mir leid, ich kann dich nicht auf diesen Kommentar verzichten, das ist ein neues Konto! aber ich kann deinen Namen schreien, Gord Thompson IST AWSOME. –

Antwort

3

Währung verwendet 15 Byte

Nein zu speichern, es funktioniert nicht. Es verwendet 8 Bytes zum Speichern und ist genau auf 15 Stellen vor dem Dezimalpunkt (Ref: here).

Einzel verwendet 7 Bytes

Nein, es 4 Bytes verwendet. Allerdings ist es eine Gleitkommadarstellung und hat daher die Grenzen der jede Gleitkomma-Datentyp wie hier beschrieben:

Is floating point math broken?

Wenn die zusätzlichen Speicherplatz benötigt Currency zu verwenden ist ein echtes Problem für Sie sollten dann einen Blick auf das Gesamtdesign Ihrer Anwendung werfen. Wenn Sie beispielsweise Bedenken hinsichtlich der 2 GB-Beschränkung für eine Access-Tabelle (Datenbankdatei) haben, ist die Access-Datenbank-Engine möglicherweise nicht mehr das richtige Tool für den Job.

Nachtrag:

Dank für das @HansUp uns daran erinnert, dass die Grenze war 1GB vor   2000 für den Zugriff auf und die OP in der Tat Access wird   97. Nach ca. 20 Jahre, vielleicht ist es Zeit, auf ein Upgrade neuere Version von Access.

+0

in Ordnung. FieldSize = 7 in Single und FieldSize = 15 in Währung. Hast du die Lösung? Da ich diese Anwendung, die 24 Jahre haben, nicht ändern kann, ist das einzige, was ich tun kann, dieses Feld in Single zu ändern, um Platz zu gewinnen. –

+0

Eine "Lösung", Raum zu sparen, die auch falsche Antworten produziert, ist keine "Lösung". Ist es die Größenbeschränkung von 2 GB, die Sie vermeiden möchten? –

+0

Ja, das ist es! aber das Limit ist 1GB brow ... Bitte nicht downvote für diese bitte ... –

3

Was Sie sehen, ist ein Gleitkommafehler - oder eher eine Einschränkung.

Sie sollten immer den Datentyp Währung verwenden, wenn Sie Berechnungen für die Daten durchführen möchten und nicht mehr als vier Dezimalstellen benötigen.

+0

Währung verwendet 15 Bytes, Single verwendet 7 Bytes, ich muss Single verwenden, da das Speicherlimit für mich sehr wichtig ist. Danke trotzdem, aber ich muss Single benutzen. –

+2

Sie können nicht beide haben. Das ist Absicht. Und es ist keine Zugriffsbeschränkung; Dies ist die Bedingung für jede Datenbank-Engine, auf die Sie stoßen können. Sie könnten die Werte vielleicht auf Ganzzahlen skalieren, aber das erfordert Berechnungen für das Lesen und Schreiben. Nicht gut. – Gustav

+1

@PauloParedes re: "Ich muss Single verwenden" - Nein, das tust du nicht. Sie müssen eine geeignete Lösung für Ihr Problem finden und 'Single' verwenden, nicht wahr? –