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.
quelle
float
,double
Unddecimal
sind 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.DECIMAL
unterscheidet sich von .NETdecimal
darin, 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 .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.
quelle
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.salary
wird im Bereich von-999999.99
bis 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.percentage
speichert Werte zwischen-999.99
bis999.99
.Beachten Sie, dass es sich in diesem Fall um einen ungefähren Wert handelt:
1 / 3.0 = 0.3333333...
wird gespeichert als0.33
(2 Dezimalstellen)33.009
wird gespeichert als33.01
(Rundung auf 2 Dezimalstellen)quelle
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.
quelle
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 :)
quelle
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 gespeichert7.65432
. In ähnlicher WeiseDouble
nähert sich der Datentyp den Werten an, ist jedoch genauer alsFloat
.Wenn Sie eine Tabelle mit einer Spalte vom
Decimal
Datentyp 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,
Decimal
ist dies der sogenannte feste Datentyp.quelle