Ich möchte 3.50 in einer MySQL-Tabelle speichern. Ich habe ein Float, in dem ich es aufbewahre, aber es speichert als 3.5, nicht 3.50. Wie kann ich erreichen, dass die abschließende Null ist?Speichern von Geldbeträgen in mysql
Antwort
Bewahren Sie keine Geldwerte als Schwimmer, verwenden Sie den DECIMAL oder NUMERIC Typ:
Documentation for MySQL Numeric Types
EDIT & Klarstellung:
Float Werte sind anfällig Fehler Rundungen sind sie Präzision begrenzt, es sei denn, es ist dir egal, dass du nur 9,99 statt 10,00 bekommst, du solltest DECIMAL/NUMERIC verwenden, da es sich um Festkommazahlen handelt, die solche Probleme nicht haben.
Spielt es wirklich eine Rolle, ob es 3,5, 3,50 oder sogar 3,500 speichert?
Was wirklich wichtig ist, ist wie es angezeigt wird, nachdem es aus der Datenbank abgerufen wird.
Oder fehlt mir hier etwas?
Verwenden Sie auch keinen Float, verwenden Sie eine Dezimalzahl. Float hat alle möglichen Rundungsfragen und ist nicht sehr groß.
Warum möchten Sie "3.50" in Ihrer Datenbank speichern? 3.5 == 3.50 == 3.5000 soweit es die Datenbank betrifft.
Ihre Präsentation und Formatierung von Zahlen/Daten/etc sollte in der Anwendung erfolgen, nicht in der Datenbank.
Wenn Sie DECIMAL- oder NUMERIC-Typen verwenden, können Sie sie beispielsweise als DECIMAL (18, 2) deklarieren, was 2 Dezimalstellen erzwingen würde, selbst wenn sie 0 wären. Abhängig davon, wie große Werte Sie erwarten, können Sie den Wert von erster Parameter
Zum Speichern von Werten Sie ein DECIMAL verwenden können (10,2) Feld, dann können Sie die FORMAT Funktion:
SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1
Es ist nicht generell eine gute Idee, um Geld als Schwimmer zu speichern, wie Rundung Fehler können in Berechnungen auftreten.
Verwenden Sie stattdessen DECIMAL (10,2).
Sogar die Zahlen wie 0,1 und 0,2 können im binären Fließkomma nicht dargestellt werden, egal wie hoch die Genauigkeit ist. http: //en.wikipedia.org/wiki/Gleitkomma – Ray
Binary kann Fließkommazahlen mit einer begrenzten Anzahl von Bits nicht genau darstellen. Es ist nicht so Muuch Verlust von Daten, sondern tatsächlich Konvertierungsfehler .. Here's the manual giving examples
Sie diese in Ihrem Browser in Aktion sehen können, für sich selbst in diesem Codeausschnitt sehen.
<script>
var floatSum = 0;
// add 0.1 to floatSum 10 times
for (var i=0; i<10; i++) {
floatSum += 0.1;
}
// if the repetative adding was correct, the floatSum should be equal to 1
var expectedSum = 10*0.1; // 1
// you can see that floatSum does not equal 1 because of floating point error
document.write(expectedSum + " == " + floatSum + " = " + (expectedSum==floatSum) + "<br />");
// --- using integers instead ---
// Assume the example above is adding £0.10 ten times to make £1.00
// With integers, we will use store money in pence (100 pence (also written 100p) in £1)
var intSum = 0;
// add 0.1 to floatSum 10 times
for (var i=0; i<10; i++) {
intSum += 10;
}
// if the repetative adding was correct, the floatSum should be equal to 1
var expectedSum = 10*10; // 100
// you can see that floatSum does not equal 1 because of floating point error
document.write(expectedSum + " == " + intSum + " = " + (expectedSum==intSum) + "<br />");
document.write("To display as £ instead of pence, we can divide by 100 (presentation only) : £" + intSum/100 + "<br />");
</script>
ich tun, um die Rundung Problem erwähnen. Mein Punkt war, dass er sich nicht darum kümmern sollte, wie es gespeichert wird, sondern wie es angezeigt wird. Sie würden Finanzinformationen nicht auf 2 Dezimalstellen speichern - Wechselkurse sind 5 und wir speichern auf 6, aber nur als 2 angezeigt. –
(vorheriger irrelevanter Kommentar gelöscht). +1 für einen guten Punkt beim Runden. –