Vault Mod: letzter Kaufpreis wird gerundet?

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Vault Mod: letzter Kaufpreis wird gerundet?

Beitrag von Dungeonwatcher »

Hi! :cool:

Ich habe den Vault Mod um eine weitere Kleinigkeit erweitert. Und zwar wird nun in der Übersicht der letzte Kaufpreis von Aktien angezeigt. Soweit so gut, denn leider klappt dies nicht ganz sauber. Anstelle des korrekten Preises mit den Nachkommastellen, wird ein gerundeter Preis ohne Nachkommastellen angezeigt. ^6

Folgendes habe ich geändert bzw. der vault.php hinzugefügt:

Mit

Code: Alles auswählen

ALTER TABLE phpbb_vault_exchange_users ADD price_transaction decimal(10,2) NOT NULL default '0';
ein neues Tabellenfeld price_transaction angelegt.

Mit

Code: Alles auswählen

$price2 = $items[$i]['stock_price'] ;
wird der korrekte aktuelle Preis der Aktie berechnet/ausgelesen, inkl. der Nachkommastellen. Das habe ich mittels

Code: Alles auswählen

echo "$price2";
getestet.

Nun soll mittels:

Code: Alles auswählen

$rsql = "UPDATE " . VAULT_EXCHANGE_USERS_TABLE ."
	SET stock_amount = stock_amount + $prize ,
	price_transaction = $price2 
	WHERE user_id = $user_id
	AND stock_id = ".$items[$i]['stock_id'];
bzw.

Code: Alles auswählen

$rsql = "INSERT INTO " . VAULT_EXCHANGE_USERS_TABLE ."
	( stock_id , user_id , stock_amount , price_transaction )
	VALUES ( ".$items[$i]['stock_id']." , $user_id , $prize , $price2 )";
der Wert der Variable $price2 in das Feld price_transaction Datenbank eingetragen werden. Dort landet aber nicht der korrekte Wert von $price2, sondern ein gerundeter. D.h. aus z.B. 37,68 wird 44.

Wo ist hier mal wieder mein Denkfehler? ^6

Bye
Zuletzt geändert von Dungeonwatcher am Do 26.Feb, 2009 12:17, insgesamt 2-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Wenn die Preise eingegeben werden, bzw. übernommen, muss man aufpassen, hier nicht Integer-Werte zu verwenden, denn Integer-Werte sind ohne Nachkommastellen!!

Allerdings würde dann aus 37,68 eher 37 werden und nicht 44...

Versuche aber mal dieses:

Code: Alles auswählen

$price2 = number_format(floatval($items[$i]['stock_price']),2);[code]
Damit wird "stock_price" in eine Gleitkommazahl umgewandelt und mit 2 Nachkommastellen versehen.

Allerdings hast Du auch das Datenbankfeld für "price_transaction" falsch angelegt:
"decimal(10,0)" ist eine maximal 10stellige Zahl [b]ohne[/b] Nachkommastellen!!
"decimal(10,2)" wäre hier korrekt ;)

Alternativ könnte man aber auch ein INT-Feld (oder BIGINT für grössere Zahlen) anlegen und den betreffenden Wert vor dem Speichern mit 100 multiplizieren.
Nach dem Auslesen aus der Datenbank kann man ihn dann auch wieder durch 100 teilen, bevor er zur Darstellung oder zu Berechnungen herangezogen wird...
Letztlich wäre das zumindest im Teil der Datenbankaktion geschickter, da weniger Speicherplatz verwendet wird und eine höhere Performance bei den Datenbankaktionen erzielt werden kann.
Oder Du verwendest den Datentyp "DOUBLE" in der Datenbank. Damit sind auch Nachkommastellen möglich. Runden muss man ja eh an der ein oder anderen Stelle (geschickter Weise vor dem Speichern), also wäre dieses sogar geschickter, als DECIMAL. Allerdings verwendet DOUBLE auch wieder mehr Platz in der Datenbank, spart aber das vor- und nachträgliche Umrechnen durch/mal 100...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Benutzeravatar
Dungeonwatcher
Beiträge: 1055
Registriert: Sa 19.Feb, 2005 01:16
Wohnort: Berlin
Kontaktdaten:

Beitrag von Dungeonwatcher »

Hi! :cool:

[quote="oxpus";p="88241"]Wenn die Preise eingegeben werden, bzw. übernommen, muss man aufpassen, hier nicht Integer-Werte zu verwenden, denn Integer-Werte sind ohne Nachkommastellen!!

Allerdings würde dann aus 37,68 eher 37 werden und nicht 44...[/quote]
Versuche aber mal dieses:

Code: Alles auswählen

$price2 = number_format(floatval($items[$i]['stock_price']),2);
Damit wird "stock_price" in eine Gleitkommazahl umgewandelt und mit 2 Nachkommastellen versehen.
Jou, damit klappt's bestens. :)
Die Funktion floatval sagt mir aber noch nichts, da muss ich mal nachlesen.

THNX
Allerdings hast Du auch das Datenbankfeld für "price_transaction" falsch angelegt:
Ähm, das war zum Glück nur ein Schreibfehler meinerseits hier im Thema. In der DB ist es korrekt.

Die anderen Vorschläge sind nicht sooo prickelnd. Mit INT bin ich schon auf die Nase gefallen weil es doch tatsächlich einer meiner User schaffte die max. mögliche Zahl zu erreichen und die DB dabei blockierte. Ein Feld war standardmäßig als MEDIUMINT angelegt:

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
A medium-size integer. The signed range is -8388608 to 8388607. The unsigned range is 0 to 16777215.


Und genau an dieser 8388607 gab's dann das Problem. ^5
Daher nutze ich lieber DECIMAL.
Zuletzt geändert von Dungeonwatcher am Do 26.Feb, 2009 12:21, insgesamt 1-mal geändert.
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Daher nutze ich lieber DECIMAL.
Wie auch immer, Hauptsache, es kann alles verwaltet werden...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
Antworten