Benötige ich zum Speichern statistischer Daten DECIMAL, FLOAT oder DOUBLE?

74

Ich erstelle zum Spaß, aber ich möchte es trotzdem ernsthaft angehen, eine Seite, auf der verschiedene Tests stattfinden. Mit diesen Tests hoffe ich statistische Daten zu sammeln.

Einige der Daten enthalten den Prozentsatz der Vollständigkeit der Tests, wenn sie zeitlich festgelegt sind. Ich kann den Prozentsatz der Tests leicht berechnen, möchte jedoch, dass echte Daten zurückgegeben werden, wenn ich die verschiedenen Werte für die Tests nach Abschluss speichere.

Die meisten Werte sind in PHP-Floats angegeben. Meine Frage ist also, ob ich echte statistische Daten möchte, wenn ich sie in MYSQL als FLOAT, DOUBLE oder DECIMAL speichere.

Ich möchte die Funktionen von MYSQL wie AVG()und LOG10()sowie nutzen TRUNCATE(). Damit MYSQL echte Daten basierend auf meinen eingefügten Werten zurückgibt, was sollte ich als Datenbankspaltenauswahl verwenden?

Ich frage, weil einige Zahlen Floats wie 10, 10.89, 99.09 oder einfach 0 sein können oder nicht. Ich möchte jedoch, dass echte und gültige statistische Daten zurückgegeben werden.

Kann ich mich dabei auf Gleitkomma-Mathematik verlassen?

BEARBEITEN

Ich weiß, dass dies eine allgemeine Frage ist, und ich entschuldige mich ausgiebig, aber für Nicht-Mathematiker wie mich, auch ich bin kein MYSQL-Experte, möchte ich die Meinung eines Experten auf diesem Gebiet.

Ich habe meine Nachforschungen angestellt, aber ich habe immer noch das Gefühl, ein getrübtes Urteil in dieser Angelegenheit zu haben. Ich entschuldige mich erneut, wenn meine Frage nicht zum Thema gehört oder für diese Site nicht geeignet ist.

PEPLOVE
quelle

Antworten:

87

Über diesen Link können Sie gut erklären, wonach Sie suchen. Folgendes wird gesagt:

Alle diese drei Typen können durch die folgenden Parameter (Größe, d) angegeben werden. Dabei ist size die Gesamtgröße des Strings und d die Genauigkeit. Um beispielsweise eine Zahl wie 1234.567 zu speichern, setzen Sie den Datentyp auf DOUBLE (7, 3), wobei 7 die Gesamtzahl der Stellen und 3 die Anzahl der Stellen nach dem Dezimalpunkt ist.

FLOAT und DOUBLE stehen beide für Gleitkommazahlen. Ein FLOAT steht für einfache Genauigkeit, während ein DOUBLE für Zahlen mit doppelter Genauigkeit steht. Eine Genauigkeit von 0 bis 23 führt zu einer 4-Byte-FLOAT-Spalte mit einfacher Genauigkeit. Eine Genauigkeit von 24 bis 53 führt zu einer 8-Byte-DOUBLE-Spalte mit doppelter Genauigkeit. FLOAT ist auf ungefähr 7 Dezimalstellen genau und DOUBLE auf 14.

Die Deklaration und Funktionsweise von Decimal ähnelt Double. Es gibt jedoch einen großen Unterschied zwischen Gleitkommawerten und Dezimalwerten (numerischen Werten). Wir verwenden den Datentyp DECIMAL, um exakte numerische Werte zu speichern, wobei wir keine Präzision, sondern exakte und genaue Werte wünschen. Ein Dezimaltyp kann maximal 65 Stellen mit 30 Stellen nach dem Dezimalpunkt speichern.

Für den genauesten und präzisesten Wert wäre Dezimal die beste Option.

Verweilen
quelle
11
Dieser Link enthält viele falsche Informationen. Ich würde seinem Rat nicht folgen.
Simon Byrne
Wenn es für die Indizierung oder als Schlüssel verwendet wird, ist ein Float unerwünscht, da der gespeicherte Wert von dem eingefügten abweichen kann
Raul Santelices
10
Ich weiß, dass dies eine alte Frage ist, aber zum Nutzen zukünftiger Leser ist diese Antwort völlig falsch und hätte NICHT akzeptiert werden dürfen. float, doubleUnd decimalsind alle ungenauen Floating-Point - Typen. Wie in dieser viel besseren Antwort erläutert , besteht der Hauptunterschied zwischen ihnen in der numerischen Basis (2 gegenüber 10) der zugrunde liegenden Datendarstellung.
David Zhang
1
@ DavidZhang Die Antwort, auf die Sie verlinkt haben, ist für .NET-Dezimalzahl, Gleitkomma usw. Diese Frage bezieht sich auf MYSQL
Svet Angelov
1
@SvetAngelov Ja, MySQL DECIMALunterscheidet sich von .NET decimaldarin, dass es eher ein Festkomma als ein Gleitkomma ist. Ich habe in meinem vorherigen Kommentar falsch geschrieben, als ich sagte, dass sie alle Gleitkommazahlen sind. Dies ändert jedoch nichts an der Tatsache, dass alle drei Datentypen von Natur aus ungenau sind. Wenn Sie zwischen ihnen auswählen, müssen Sie die Art der Ungenauigkeit auswählen, die Sie tolerieren möchten .
David Zhang
10

Sofern Sie keine Dezimaldaten (dh Währung) speichern, sollten Sie einen Standard-Gleitkommatyp (FLOAT oder DOUBLE) verwenden. DECIMAL ist ein Festkommatyp, der bei der Berechnung von Dingen wie SUM überlaufen kann und für LOG10 lächerlich ungenau ist.

Binäre Gleitkommatypen sind nicht "weniger präzise". Tatsächlich sind sie für Ihre Anforderungen viel genauer (und schneller). Gehen Sie mit DOUBLE.

Simon Byrne
quelle
In den Dokumenten wird erwähnt, dass die Berechnungen für den Datentyp "für Dezimal" genau sind. dev.mysql.com/doc/refman/5.7/en/precision-math-numbers.html
Daksh
1
Während die Summe der Festpunktwerte genau ist, können andere Operationen (wie Division oder log10) nicht sein: Es gibt einfach keine Möglichkeit, das Ergebnis im Festpunkt darzustellen.
Simon Byrne
Können Sie mich auf eine Ressource verweisen, in der ich mehr darüber bereitstellen kann, wo immer ich darüber gelesen habe? Alles, was geschrieben steht, ist, dass für genaue Berechnungen Dezimaltypen verwendet werden.
Daksh
1
Jede anständige Berichterstattung über numerische Analysen (mein Favorit ist Nick Highams "Genauigkeit und Stabilität numerischer Algorithmen") deckt Fest- und Gleitkomma-Darstellungen ab.
Simon Byrne
Werde einen Blick darauf werfen!
Daksh
8

Dezimal : Festkommatypen ( exakter Wert). Verwenden Sie es, wenn Sie Wert auf exakte Präzision wie Geld legen.

Beispiel: salary DECIMAL(8,2)8 ist die Gesamtzahl der Ziffern, 2 ist die Anzahl der Dezimalstellen. salarywird im Bereich von -999999.99bis liegen999999.99


Float, Double : Gleitkommatypen ( ungefährer Wert). Float verwendet 4 Bytes, um den Wert darzustellen, Double verwendet 8 Bytes, um den Wert darzustellen.

Beispiel: percentage FLOAT(5,2)Wie beim Dezimaltyp sind 5 die Gesamtzahl der Ziffern und 2 die Dezimalstellen. percentagespeichert Werte zwischen -999.99bis 999.99.

Beachten Sie, dass es sich in diesem Fall um einen ungefähren Wert handelt:

  • Wert wie 1 / 3.0 = 0.3333333...wird gespeichert als 0.33(2 Dezimalstellen)
  • Wert wie 33.009wird gespeichert als 33.01(Rundung auf 2 Dezimalstellen)
Zeitlos
quelle
6

Einfach ausgedrückt sind Float und Double nicht so präzise wie Dezimalzahlen. Für die Eingabe geldbezogener Zahlen (Währung und Gehalt) wird eine Dezimalzahl empfohlen. Ein weiterer Punkt, auf den hingewiesen werden muss, ist: Vergleichen Sie die Gleitkommazahlen NICHT mit "=", "<>", da die Gleitkommazahlen nicht genau sind.

waterinusa
quelle
1

Linger: Die Website, die Sie erwähnen und zitieren, enthält IMO einige ungenaue Informationen, die mich verwirrt haben. In den Dokumenten habe ich gelesen, dass der Dezimalpunkt tatsächlich NICHT in der Zahl enthalten ist, wenn Sie ein Float oder ein Double deklarieren. Es ist also nicht die Anzahl der Zeichen in einer Zeichenfolge, sondern alle verwendeten Ziffern.

Vergleichen Sie die Dokumente: "DOPPELTE PRÄZISION (M, D). Hier bedeutet" (M, D) ", dass Werte mit insgesamt bis zu M Ziffern gespeichert werden können, von denen D Ziffern nach dem Dezimalpunkt liegen können. Zum Beispiel Eine als FLOAT (7,4) definierte Spalte sieht bei Anzeige von " http://dev.mysql.com/doc/refman/5.1/en/floating-point-types.html " wie -999.9999 aus

Auch die Nomenklatur in irreführender - laut docs: M ist "Präzision" und D ist "Skala", während die Website "Skala" für "Präzision" nimmt.

Ich dachte, es wäre nützlich, wenn jdn wie ich versuchen würde, sich ein Bild zu machen. Korrigieren Sie mich, wenn ich falsch liege, hoffe ich habe einige veraltete Dokumente nicht gelesen :)

Joey
quelle
0

Float und Double sind Gleitkomma-Datentypen. Dies bedeutet, dass die von ihnen gespeicherten Zahlen nur bis zu einer bestimmten Anzahl von Stellen präzise sein können. Zum Beispiel für eine Tabelle mit einer Spalte vom Typ float, wenn Sie sie speichern 7.6543219, wird sie als gespeichert 7.65432. In ähnlicher Weise Doublenähert sich der Datentyp den Werten an, ist jedoch genauer als Float.

Wenn Sie eine Tabelle mit einer Spalte vom DecimalDatentyp erstellen, geben Sie die Gesamtzahl der zu speichernden Stellen und die Anzahl der Stellen nach der Dezimalstelle an. Wenn die von Ihnen gespeicherte Zahl innerhalb des von Ihnen angegebenen Bereichs liegt, wird sie genau gespeichert.

Wenn Sie genaue Werte speichern möchten, Decimalist dies der sogenannte feste Datentyp.

Daksh
quelle