Lange Zahle in der DB speichern
Lange Zahle in der DB speichern
am 25.09.2006 09:27:32 von Bernhard Schimanski
Hallo NG,
in der Datenbank habe ich Spalten von dem Typ "float", "real" und "money".
Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
In den Spalten von oben genannten werden sie leider nicht korrekt
gespeichert:
- monny, am Ende werden zwei Nullen angehängt, Bsp.: 123456789.1200
- real, die Zahl wird abgerundet auf: 123456792
- float wird dagegen richtig abgespeichert aber in der Html Seite falsch
angezeigt, Bsp.: 1.23457e+008
Beim schreiben der Daten in die DB caste oder convertier ich die Werte,
money, float werden konvertirt: CONVERT(money, Wert), alle anderen Werte
werden gecastet: CAST(Wert, AS NVARCHAR) das casten umfasst auch "real".
Datenbank MSSQL 2005.
Wie kann ich dieses Problem beheben?
Grüße Bernhard
Re: Lange Zahle in der DB speichern
am 25.09.2006 11:02:36 von Ulf Kadner
Bernhard Schimanski wrote:
> in der Datenbank habe ich Spalten von dem Typ "float", "real" und "money".
> Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
>
> In den Spalten von oben genannten werden sie leider nicht korrekt
> gespeichert:
> - monny, am Ende werden zwei Nullen angehängt, Bsp.: 123456789.1200
> - real, die Zahl wird abgerundet auf: 123456792
>
> - float wird dagegen richtig abgespeichert aber in der Html Seite falsch
> angezeigt, Bsp.: 1.23457e+008
>
> Beim schreiben der Daten in die DB caste oder convertier ich die Werte,
> money, float werden konvertirt: CONVERT(money, Wert), alle anderen Werte
> werden gecastet: CAST(Wert, AS NVARCHAR) das casten umfasst auch "real".
>
> Datenbank MSSQL 2005.
>
> Wie kann ich dieses Problem beheben?
Gegenfrage wo siehst Du hier ein PHP-Problem?
Microsoft-DB-NGs existieren!
z.B.:
microsoft.public.de.german.entwickler.dotnet.datenbank
es gibt sicher noch treffendere
MfG, Ulf
Re: Lange Zahle in der DB speichern
am 25.09.2006 11:07:50 von dev-null-use-reply-adress
Bernhard Schimanski schrieb:
> in der Datenbank habe ich Spalten von dem Typ "float", "real" und "money".
Also gehört Deine Frage mindestens nach d.c.l.p.datenbanken.
> Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
>
> In den Spalten von oben genannten werden sie leider nicht korrekt
> gespeichert:
> - monny, am Ende werden zwei Nullen angehängt, Bsp.: 123456789.1200
Bei MySQL kann man das, z.B. beim Typ DECIMAL, exakt einstellen.
Bei Deiner DB ddoch bestimmt auch. Siehe Handbuch.
> - real, die Zahl wird abgerundet auf: 123456792
Vermutlich die gleiche Ursache.
> - float wird dagegen richtig abgespeichert aber in der Html Seite falsch
> angezeigt, Bsp.: 1.23457e+008
Aah, hier kann ich wengistens einen kleinen PHP-Bezug sehen. ;-)
Du suchst printf(), oder sprintf(), oder number_format().
> Beim schreiben der Daten in die DB caste oder convertier ich die Werte,
> money, float werden konvertirt: CONVERT(money, Wert), alle anderen Werte
> werden gecastet: CAST(Wert, AS NVARCHAR) das casten umfasst auch "real".
Das hat nun wirklich garnichts mit PHP zu tun.
> Datenbank MSSQL 2005.
>
> Wie kann ich dieses Problem beheben?
Handbuch zu Deiner DB lesen.
Gruß
JPM
Re: Lange Zahle in der DB speichern
am 25.09.2006 12:11:30 von Bernhard Schimanski
Ulf Kadner schrieb:
> Bernhard Schimanski wrote:
>
>> in der Datenbank habe ich Spalten von dem Typ "float", "real" und
>> "money".
>> Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
>>
>> In den Spalten von oben genannten werden sie leider nicht korrekt
>> gespeichert:
>> - monny, am Ende werden zwei Nullen angehängt, Bsp.: 123456789.1200
>> - real, die Zahl wird abgerundet auf: 123456792
>>
>> - float wird dagegen richtig abgespeichert aber in der Html Seite
>> falsch angezeigt, Bsp.: 1.23457e+008
>>
>> Beim schreiben der Daten in die DB caste oder convertier ich die
>> Werte, money, float werden konvertirt: CONVERT(money, Wert), alle
>> anderen Werte werden gecastet: CAST(Wert, AS NVARCHAR) das casten
>> umfasst auch "real".
>>
>> Datenbank MSSQL 2005.
>>
>> Wie kann ich dieses Problem beheben?
>
> Gegenfrage wo siehst Du hier ein PHP-Problem?
ist nicht ganz zutreffende, stimme zu, die Unterschiede der Werte in der
DB und in der Html Seite, die PHP erzeugt haben mich da zu veranlasst
doch hier erst nach zu fragen, ich dachte man kann die ausgelesenen
Werte doch noch mit PHP beeinflussen.
> Microsoft-DB-NGs existieren!
>
> z.B.:
> microsoft.public.de.german.entwickler.dotnet.datenbank
>
Danke für den Tipp.
Grüße Bernhard
Re: Lange Zahle in der DB speichern
am 25.09.2006 14:48:19 von Stefan Scholl
Bernhard Schimanski wrote:
> in der Datenbank habe ich Spalten von dem Typ "float", "real" und "money".
> Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
>
> In den Spalten von oben genannten werden sie leider nicht korrekt
> gespeichert:
> - monny, am Ende werden zwei Nullen angehängt, Bsp.: 123456789.1200
> - real, die Zahl wird abgerundet auf: 123456792
Ist das oben ggf. nur 1 Null statt zwei? Hört sich nach
Lokalisierung an.
Re: Lange Zahle in der DB speichern
am 25.09.2006 14:57:34 von Alex Hepp
Stefan Scholl schrieb:
> Bernhard Schimanski wrote:
>> in der Datenbank habe ich Spalten von dem Typ "float", "real" und "money".
>> Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
>>
>> In den Spalten von oben genannten werden sie leider nicht korrekt
>> gespeichert:
>> - monny, am Ende werden zwei Nullen angehängt, Bsp.: 123456789.1200
>> - real, die Zahl wird abgerundet auf: 123456792
>
> Ist das oben ggf. nur 1 Null statt zwei? Hört sich nach
> Lokalisierung an.
Währungen werden meist mit 4 Nachkommastellen gerechnet (zumindest muss
in der Finanzwelt mind. mit 4 Stellen gerechnet werden). Schätze mal,
dass das eher daher kommt!
Das Problem ist aber hier wohl eher nicht php. Das einzige php-problem
ist das mit der Anzeige...
Hier sollte sich der OP vielleicht mal number_format() od. printf()
anschauen!
HTH. Alex
Re: Lange Zahle in der DB speichern
am 26.09.2006 03:30:14 von daniel.gorski
[Bernhard Schimanski in de.comp.lang.php.misc]
> [Offensichtlich Geldbeträge]
> in der Datenbank habe ich Spalten von dem Typ "float", "real" und "money".
> Aus einem Formular bekomme ich lange Zahlen, wie zB.: 123456789.12
Ausser den dir bereits gegeben Antworten hier in dclp.misc und und
dclp.datenbanken möchtest du _nie_ Geldbeträge als real, money oder decimal
speichern - Stichwort Mantisse.
Du speicherst Geldbeträge immer in der kleinstmöglichen Währung, z.B. Cent
(oder z.B. tausendstel Cent) als Ganzzahlvariable und nimmst eine Rundung
in einer Schicht vor, bei der es nicht unbedingt auf die Tausendstel
ankommt, bei der Präsentation/View/Ausgabe, aber nie bei einer Berechnung.
Auch dem Datentyp "money" würde ich nicht vertrauen, wenn es z.B. darum
geht, irgendwann den Datenbankbestand und somit irgendwelche Preise und
Faktoren auf ein anderes Datenbanksystem zu migrieren oder diese Daten
andersweitig zu exportieren.
Sollte ein RDBMS sich nicht eignen, die benötigten vielstelligen Zahlen
(Preise) abzubilden, ist es dringend geboten, sich nach einem anderem RDBMS
umzuschauen.
.... nur meine zwei Cent (Speicherungsform bleibt ausnahmsweise dem Leser
überlassen)
mfg dtg
Re: Lange Zahle in der DB speichern
am 26.09.2006 04:10:21 von Niels Braczek
Daniel T. Gorski schrieb:
> Du speicherst Geldbeträge immer in der kleinstmöglichen Währung, =
z.B. Cent
> (oder z.B. tausendstel Cent) als Ganzzahlvariable und nimmst eine Rundu=
ng
> in einer Schicht vor, bei der es nicht unbedingt auf die Tausendstel
> ankommt, bei der Präsentation/View/Ausgabe, aber nie bei einer Berech=
nung.
Es sei denn, der verwendete Berechnungsalgorithmus (zB. Bankzinsen)
schreibt die Rundung vor.
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Lange Zahle in der DB speichern
am 26.09.2006 05:06:07 von daniel.gorski
[Niels Braczek in de.comp.lang.php.misc]
Hallo Niels,
>> Du speicherst Geldbeträge immer in der kleinstmöglichen Währung, z.B.
>> Cent (oder z.B. tausendstel Cent) als Ganzzahlvariable und nimmst eine
>> Rundung in einer Schicht vor, bei der es nicht unbedingt auf die
>> Tausendstel ankommt, bei der Präsentation/View/Ausgabe, aber nie bei
>> einer Berechnung.
> Es sei denn, der verwendete Berechnungsalgorithmus (zB. Bankzinsen)
> schreibt die Rundung vor.
Ich hatte noch nie mit "richtigen" Banktransaktionen zu tun (und ich brauche
das auch nicht wirklich), aber der von dir erwähnte "Berechnungsalgorithmus
für Bankzinsen" - Algo rechnet hoffentlich so wie ich das schliderte ...
mit Ganzzahlen.
Ich habe auch nichts gegen Rundungen (sic!), wie die sich eine Bank
vorstellt, aber nicht mit Zahlenabstraktionen (real, float, decimal) mit
Mantisse :)
Das würde ja bei meinem Vermögen und den Rundungsmilliarden, wahrscheinlich
einen fetten Gewinn zugungsten der Bank ausmachen ... nene, das geht mal
nicht ;)
Oder sollte ich im besten Fall von den positven Rundungsfehlern Andorra
kaufen ... hm, aber die lassen mich eh nicht, die Bänker ... muss
wahrscheinlich trotzdem eine Hypothek auf San Marino hinterlegen ... nicht
leicht diese Entscheidungen ...
mfg dtg
Re: Lange Zahle in der DB speichern
am 26.09.2006 05:31:22 von Niels Braczek
Daniel T. Gorski schrieb:
> [Niels Braczek in de.comp.lang.php.misc]
>> Daniel T. Gorski schrieb:
>=20
>>> Rundung [...] nie bei einer Berechnung.
>=20
>> Es sei denn, der verwendete Berechnungsalgorithmus (zB. Bankzinsen)
>> schreibt die Rundung vor.
>=20
> Ich hatte noch nie mit "richtigen" Banktransaktionen zu tun (und ich br=
auche
> das auch nicht wirklich), aber der von dir erwähnte "Berechnungsalgor=
ithmus
> für Bankzinsen" - Algo rechnet hoffentlich so wie ich das schliderte =
..
> mit Ganzzahlen.=20
Nein, in der Praxis wird meist mit BCD-Darstellung gearbeitet (und in
COBOL programmiert).
> Oder sollte ich im besten Fall von den positven Rundungsfehlern Andorra=
> kaufen ...=20
Das wird nichts; die Bank rundet immer zu ihren Gunsten.
Egal, ist eh OT.
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------