Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - 2,30*10= 23,01? Was Soll das??
cugar - Sa 16.11.02 11:56
Titel: 2,30*10= 23,01? Was Soll das??
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.
Anonymous - 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 - 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 - 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 - 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.
Anonymous - 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 - Do 21.11.02 18:51
Dafür muss man eben ein entspr. Handlich einbauen... z.B. String zerlegen und mit Teilstrings arbeiten...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!