Domino 9 und frühere Versionen > ND6: Entwicklung
Datum und Zeitbrechnung
koehlerbv:
Nicht schlecht formuliert :)
Marinero Atlántico:
Currency rundet wohl nach jeder Operation. :-:
Zumindest kann ich mir die Ergebnisse dieses Skriptes nicht anders erklären.
--- Code: ---Sub Initialize
Dim cur As Currency
Dim dob As Double
Dim curSum As Currency
Dim dobSum As Double
cur = 1/3
Print "cur=" & Cstr(cur)
dob = 1/3
Print "dob=" & Cstr(dob)
curSum = 0
dobSum = 0
For i=0 To 1000
curSum = curSum + cur
dobSum = dobSum + dob
Next
Print "curSum=" & Cstr(curSum)
Print "dobSum=" & Cstr(dobSum)
End Sub
--- Ende Code ---
Ergibt für cur ,3333, für double ,333333333333333
Jetzt könntest du noch argumentieren, dass diese 4 Stellen nur eine externe Darstellungsformel ist, die von der (genaueren) internen Darstellung abweicht. Das ist aber nicht der Fall.
Die Ergebnisse der Schleife mit den 1000 Aditionen kommen zu unterschiedlichen Ergebnissen, die ich mir nur dadurch erklären kann, dass bei currency zum Abschluss jeder Operation auf 4 Stellen hinter dem Komma gerundet wird:
curSum ergibt: 333,6333
doubleSum ergibt: 333,666666666665
Beide Zahlen unterscheiden sich ab der 2. Dezimalstelle relativ stark und das kommt eben dadurch, dass bei currency zum Abschluß jeder Operation auf 4 Stellen gerundet wird.
Semeaphoros:
Gerade nachgeschaut, entgegen der ursprünglichen Basic-Definition implementiert LS Currency als Integer (was, da es dokumentiert ist, auch zulässig ist). Von Runden steht da nichts, das wird nach der 4. Stelle abgeschnitten.
Marinero Atlántico:
Noch besser:
Hier habe ich das von mir für Currency behauptete Verhalten für Double nachprogrammiert.
Die Empirie ist auf meiner Seite:
--- Code: ---Sub Initialize
Dim cur As Currency
Dim dob As Double
Dim dobRounded As Double
Dim curSum As Currency
Dim dobSum As Double
Dim dobRoundedSum As Double
cur = 1/3
Print "cur=" & Cstr(cur)
dob = 1/3
Print "dob=" & Cstr(dob)
dobRounded = Round(1/3, 4)
Print "dobRounded=" & Cstr(dobRounded)
curSum = 0
dobSum = 0
For i=0 To 1000
curSum = curSum + cur
dobSum = dobSum + dob
dobRoundedSum = Round(dobRoundedSum + dobRounded, 4)
Next
Print "curSum=" & Cstr(curSum)
Print "dobSum=" & Cstr(dobSum)
Print "dobRoundedSum=" & Cstr(dobRoundedSum)
End Sub
--- Ende Code ---
Marinero Atlántico:
Abschneiden ist imho auch eine Form des Rundens.
Die Behauptung, currency würde nach einer anderen Rundungsregel funktionieren als
Round(val, 4), fänd ich angesichts des letzten von mir geposteten Agenten ein bischen stur.
--- Code: ---Dim cur as Currency
cur = 2/3
--- Ende Code ---
ergibt 0,6667
würde nach der 4. Stelle abgeschnitten, müßte es 0,6666 ergeben.
Ich kann mich auch von einem Finanzmathematik Kurs in der Uni erinnern, dass da runden-nach-jeder-Operation etwas völlig normales ist.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln