Rechnen mit Currency-Datentype

Hallo,

da es auf einen Feedback-Beitrag keine Reaktion gibt, wollte ich fragen ob ich einen Fehler mache oder das Rechenergebnis ein Bug ist.
feedback://showreport?report_id=20841

Xojo 2013r1, Windows 8 Pro 32-bit

Dim A, B, C As Currency
A = 1000000
B = 100000
C = A * B
MsgBox(Format(C, "-#.#")) // zeigt: -84467440737,1
MsgBox(Str(C)) // zeigt: -84467440737.0955

Ergebnis sollte sein 100.000.000.000

Peter

Danke an Christian Schmitz für seine Beiträge im Feedback-Eintrag, ich bin so frei und kopiere einen hierher:

[quote]I think I found it. You are hitting the 64bit limit.
internally those values are stored multiplied by 10000.
So you have 0x2540BE400 multiply by 0x3B9ACA00 which gives 0x8AC7230489E80000.
As we have the 8 in front, we get a negative number.
you get the same result with Int64:[/quote]

Dim A, B, C As Int64
A = 1000000
B = 100000 
A = A * 10000
B = B * 10000
C = A * B
break

Switching to UInt64 and it works. (as you have one bit more for math)

Deine Erklärung verstehe ich. Mich wundert jetzt das z.B. Visual Basic 5 von 1997 richtig rechnet. Die Beschreibung zum Currency-Datentype ist dabei nahezu identisch mit der Xojo Language Referenz:

[quote]Hilfe von Visual Basic 5:
Variablen vom Datentyp Currency werden als 64-Bit-Zahlen (8 Bytes) in einem ganzzahligen Format gespeichert und durch 10.000 dividiert, was eine Festkommazahl mit 15 Vorkomma- und 4 Nachkommastellen ergibt. Diese Darstellung ergibt einen Wertebereich von -922.337.203.685.477,5808 bis 922.337.203.685.477,5807. Das Typkennzeichen für Currency ist das Zeichen (@).
Der Datentyp Currency eignet sich besonders für Berechnungen mit Geldbeträgen und für Festkommaberechnungen, die eine hohe Genauigkeit erfordern.[/quote]

Mein Fehler liegt also daran, dass ich nicht bedacht habe mit welchen Datentyp die Zwischenergebnisse berechnet werden.

Peter

Hallo nochmals,

also so ganz verstehe ich es doch nicht:

[code]Dim A As Currency
A = 922337203685477.5807 // 63 Bit ohne Vorzeichen
MsgBox(Format(A, “-0.0000”)) // zeigt: -922337203685477,6200 <- gerundet?
MsgBox(Str(A, “-0.0000”)) // zeigt: -922337203685477,6200 <- gerundet?
MsgBox(Str(A)) // zeigt: -0.5808 <- ?

Dim B As Currency
B = 461168601842738.7903 // 62 Bit ohne Vorzeichen
MsgBox(Format(B, “-0.0000”)) // zeigt: 461168601842738,8100 <- gerundet?
MsgBox(Str(B, “-0.0000”)) // zeigt: 461168601842738,8100 <- gerundet?
MsgBox(Str(B)) // zeigt: 461168601842738.7904 <- letzte Kommastelle?[/code]

Verwendet wurde 2013r2b2 und Windows 8 Pro 32 Bit.

Peter

Hallo,

die obigen ‘gerundeten’ Ausgaben dürften Fehler bei den Format-Anweisungen sein. Ist auch bei UInt64-Datentyp so:

Dim A As UInt64
A = 9223372036854775807
MsgBox(Format(A, "-#")) // zeigt: 9223372036854775800 <- letzte Stelle?
MsgBox(Str(A, "-#")) // zeigt: 9223372036854775800 <- letzte Stelle?
MsgBox(Str(A)) //zeigt: 9223372036854775807 <- ok!

Auch wenn jetzt intern richtig gerechnet wird, wie kann man Werte formatiert anzeigen und sich sicher sein dass sie richtig angezeigt werden?

Peter