Ich erstelle diese API und die Datenbank speichert Werte, die einen der folgenden Werte darstellen:
- Prozentsatz
- durchschnittlich
- Bewertung
Ich habe ehrlich gesagt keine Ahnung, wie ich etwas darstellen soll, dessen Zahlen zwischen 0 und 100% liegen. Sollte es sein
- 0,00 - 1,00
- 0,00 - 100,00
- jede andere Alternative, die ich nicht kenne
Gibt es dafür eine klare Wahl? Eine globale Art, in Datenbanken etwas darzustellen, das von 0 bis 100% Prozent reicht? Was ist der richtige Typ dafür, float oder decimal?
Vielen Dank.
int
, um Hundertstel oder in Einheiten von Permyriad oder ‱ darzustellen.Antworten:
Ich werde die entgegengesetzte Haltung einnehmen.
FLOAT
Dies gilt für ungefähre Zahlen wie Prozentsätze, Durchschnittswerte usw. Sie sollten die Formatierung durchführen, während Sie die Werte entweder im App-Code oder mithilfe derFORMAT()
Funktion von MySQL anzeigen .Testen Sie niemals
float_value = 1.3
; Es gibt viele Gründe, warum dies fehlschlagen wird.DECIMAL
sollte für Geldwerte verwendet werden.DECIMAL
vermeidet eine zweite Rundung, wenn ein Wert auf Dollar / Cent / Euro / etc. gerundet werden muss. Buchhalter mögen keine Bruchteile von Cent.Die Implementierung von MySQL
DECIMAL
erlaubt 65 signifikante Stellen.FLOAT
gibt ungefähr 7 undDOUBLE
ungefähr 16. 7 ist normalerweise mehr als genug für Sensoren und wissenschaftliche Berechnungen.Wie für "Prozentsatz" - Manchmal habe ich verwendet,
TINYINT UNSIGNED
wenn ich nur 1 Byte Speicher verbrauchen möchte und nicht viel Präzision benötige; manchmal habe ich verwendetFLOAT
(4 Bytes). Es gibt keinen Datentyp, der speziell auf den Prozentsatz abgestimmt ist. (Beachten Sie auch, dassDECIMAL(2,0)
der Wert nicht gespeichert werden kann100
, also technisch würden Sie ihn benötigenDECIMAL(3,0)
.)Oder manchmal habe ich eine verwendet
FLOAT
, die einen Wert zwischen 0 und 1 hat. Dann müsste ich jedoch sicherstellen, dass sie mit 100 multipliziert wird, bevor der "Prozentsatz" angezeigt wird.Mehr
Alle drei von "Prozentsatz, Durchschnitt, Rate" riechen nach Schwimmern, das wäre also meine erste Wahl.
Ein Kriterium für die Entscheidung über den Datentyp ... Wie viele Kopien des Werts werden vorhanden sein?
Wenn Sie eine Milliardenzeilentabelle mit einer Spalte für einen Prozentsatz haben, sollten Sie berücksichtigen, dass
TINYINT
dies 1 Byte (insgesamt 1 GB), aberFLOAT
4 Byte (insgesamt 4 GB) dauern würde. OTOH, die meisten Anwendungen haben nicht so viele Zeilen, daher ist dies möglicherweise nicht relevant.In der Regel sollten "exakte" Werte eine Form von
INT
oder verwendenDECIMAL
. Ungenaue Dinge (wissenschaftliche Berechnungen, Quadratwurzeln, Division usw.) sollten verwendet werdenFLOAT
(oderDOUBLE
).Darüber hinaus sollte die Formatierung der Ausgabe normalerweise dem Frontend der Anwendung überlassen bleiben. Das heißt, obwohl ein "Durchschnitt" zu "14.6666666 ..." berechnen kann, sollte die Anzeige so etwas wie "14.7" anzeigen; Das ist freundlicher für den Menschen. In der Zwischenzeit haben Sie den zugrunde liegenden Wert, um später zu entscheiden, dass "15" oder "14.667" die bevorzugte Ausgabeformatierung ist.
Der Bereich "0,00 - 100,00" kann entweder mit
FLOAT
und unter Verwendung der Ausgabeformatierung oder mitDECIMAL(5,2)
(3 Bytes) mit der Voreinstellung festgelegt werden, dass Sie immer die angegebene Genauigkeit wünschen .quelle
Ich würde generell davon abraten, es zu benutzen
float
. Gleitkommazahlen stellen Zahlen in Basis 2 dar, was dazu führt, dass einige (exakte) Zahlen in Operationen oder Vergleichen aufgerundet werden, da sie in Basis 2 einfach nicht genau gespeichert werden können. Dies kann zu überraschenden Verhaltensweisen führen.Betrachten Sie das folgende Beispiel :
Der Basis-2-Vergleich der Anzahl
1.3
schlägt fehl. Das ist schwierig.Im Vergleich dazu liefern Dezimalstellen eine genaue Darstellung endlicher Zahlen innerhalb ihres Bereichs. Wenn Sie ändern ,
float
umdecimal(2, 1)
in dem obigen Beispiel, haben Sie die erwarteten Ergebnisse erzielen.quelle
Der Unterschied zwischen Gleitkomma- und Dezimalzahl ist die Genauigkeit. Dezimal kann 100% genau innerhalb der Genauigkeit des Dezimalformats darstellen, während Float nicht alle Zahlen genau darstellen kann.
Verwenden Sie Dezimal für z. B. den finanziellen Wert und float für z. B. den grafischen Wert
quelle
Ich empfehle die Verwendung,
decimal(5,2)
wenn Sie es auf die gleiche Weise speichern möchten, wie Sie es anzeigen, dadecimal
die genaue Genauigkeit erhalten bleibt. (Siehe https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html )( https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html )
https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
quelle
Dezimal: Bei Finanzanwendungen ist es besser, Dezimaltypen zu verwenden, da dies ein hohes Maß an Genauigkeit bietet und Rundungsfehler leicht zu vermeiden sind
Double: Double Types sind wahrscheinlich der am häufigsten verwendete Datentyp für reale Werte, außer für den Umgang mit Geld.
Float: Es wird hauptsächlich in Grafikbibliotheken verwendet, da sehr hohe Anforderungen an die Verarbeitungsleistung gestellt werden und auch Situationen verwendet werden, in denen Rundungsfehler auftreten können.
Referenz: http://net-informations.com/q/faq/float.html
quelle
Die Dezimalstelle hat genau das getan, was in diesen Fällen zu tun ist. Sie hat den Rest abgeschnitten und damit den 1/3 Teil verloren.
Für Summen ist die Dezimalzahl also besser, aber für Divisionen ist der Float besser, natürlich bis zu einem gewissen Punkt. Ich meine, mit DECIMAL erhalten Sie in keiner Weise eine "ausfallsichere Arithmetik".
Ich hoffe das wird helfen.
quelle
In tsql: Float wird 0.0 als 0 gespeichert und muss nicht nach der Dezimalstelle definiert werden, z. B. muss Float (4,2) nicht geschrieben werden. Dezimal, 0.0 als 0.0 speichern und es hat die Option, wie Dezimal (4,2) zu definieren. Ich würde 0,00-1,00 vorschlagen. Auf diese Weise können Sie den Wert dieses Prozentsatzes berechnen, ohne mit 100 zu multiplizieren. Wenn Sie einen Bericht erstellen, legen Sie den Datentyp fest dieser Spalte in Prozent wie MS Excel und andere Plattformansichten wie
0.5 -> 50%
.quelle