Autor Beitrag
cugar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

win7
Delphi XE Prof
BeitragVerfasst: Sa 16.11.02 11:56 
Hallo!
Habe ein Problem, in meinem Programm habe ich den Artikelpreis als Currency festgelegt, ein Artikel kostet z.B. 2,30 €. Wenn ich den Preis mit Menge z.B. 10 multipliziere kommt.. 23,01 raus. Warum? Im Probelauf habe ich festgestellt, das der Preis nicht als 2,30 da steht, sondern als 2,308xxxxxx (es sind 15 Nachkomastellen), es bringt auch nichts die Precision im Datenmodul auf 3 oder so zu setzen. Als Ergebnis kommt immer 23,01 raus.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 16.11.02 13:32 
Dann hast du die Variable auch nicht als Currency deklariert.

OH:

Zitat:
Eine Currency-Zahl mit 8 Byte (64 Bit) wird als skalierter 64-Bit-Integer mit Vorzeichen gespeichert. Dabei stehen die vier niedrigwertigen Ziffern implizit für vier Dezimalstellen. Currency-Werte liegen im Bereich von -922.337.203.685.477,5808 bis 922.337.203.685.477,5807.


Ein "2,308xxxxxx (es sind 15 Nachkomastellen)" ist also nicht möglich.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 21.11.02 11:39 
Datenmodul? Arbeitest Du mit einer Datenbank, z.B. Interbase? Dann prost, Mahlzeit, wenn Du ein Währungsfeld als Fließkommazahl erstellst. Nimm lieber Decimal(15,2), da stimmts dann. Denn Fließkommawerte sind irgendwie nie genau, das hat irgendwie was mit der CPU zu tun, kanns dir im Moment leider nicht erklären.... vielleicht kommt da noch was von den anderen *g*
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Do 21.11.02 11:56 
Hallo,
UGrohne hat folgendes geschrieben:
Denn Fließkommawerte sind irgendwie nie genau, das hat irgendwie was mit der CPU zu tun, kanns dir im Moment leider nicht erklären.... vielleicht kommt da noch was von den anderen *g*

das liegt dadran, das es technisch nicht mölich ist, in einer entlichen Anzahl von Bits (bei Comp sind es 64) eine unentliche Anzahl von werten abzubilden. Immerhin gint es auch zwischen 0.1 und 0.2 unentlich viele Werte (wenn man exakte genauigkeit vorraussetzt). Also kann ein Computer immer nur mit näherungen arbeiten. Dies erzeugt aber zwangsweise Rundungsfehler. Da wird aus einer 2,30 schon mal leicht eine 2,308xxxxxx. Sämtliche Digitalen geräte sind in dieser Weise ungenau, sie gaukeln uns nur vor unheimlich präzise zu sein.

Gruß
Klabutermann
FriFra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 557

Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
BeitragVerfasst: Do 21.11.02 12:30 
Also ich lese solche Zahlen (wenn möglich) immer als String ein und erhöhe Sie ersmal um den Faktor 100, indem ich das ',' bzw. '.' entferne (vorher muss ggf. noch '.00' oder '0' angehängt werden). Dann mache ich daraus Integer bzw. Longint Zahlen mit denen ich dann rechne. Das Ergebnis mache ich dann wieder zum String und schleuse ein Komma ein ('12300' -> '123,00'). Damit hatte ich noch nie Rundungsfehler.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 21.11.02 18:38 
Wenn du aber eine große Zahl hast, dann kann es dir passieren, das plötzlich ein 1,524157875e+40 draus wird. Und schon hast du wieder Rundungsfehler. Auch bei der ganzen Zahl, weil sie jetzt keine mehr ist.

Wenn Currency zu groß wird, dann (ich hoffe es) gibts einfach nur eine Fehlermeldung.
FriFra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 557

Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
BeitragVerfasst: Do 21.11.02 18:51 
Dafür muss man eben ein entspr. Handlich einbauen... z.B. String zerlegen und mit Teilstrings arbeiten...