Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Ronny am 26.11.14 - 19:53:15

Titel: INT rechnet fehlerhaft
Beitrag von: Ronny am 26.11.14 - 19:53:15
Hallo zusammen,

warum kommt bei der nachfolgenden Gleichung ein unterschiedliches Ergebnis:

Print 2.3/0.05, Int(2.3/0.05)

obwohl das Ergebnis doch in beiden Fällen gleich ist (sein sollte)
Titel: Re: INT rechnet fehlerhaft
Beitrag von: koehlerbv am 26.11.14 - 22:24:34
Es kommt bei Basic-Dialekten immer zur Verwirrung, wenn der links der Anweisung stehende Ausdruck zunächst impliziert, das der Datentyp auch rechts führend ist.
Ausweg: Weise Dein Rechenergebnis einem Variablentyp zu, der fdas auch verträgt (hier: Double). Wandle diesen dann um. Dann klappt es auch mit dem Nachbarn.

HTH,
Bernhard
Titel: Re: INT rechnet fehlerhaft
Beitrag von: Werner Götz am 27.11.14 - 08:06:18
Ich denke, dass gerade Double das Problem ist ...

Der richtige Datentyp ist Currency - auch wenn die Doku zu diesem Datentyp auf den 1. Blick etwas anderes suggeriert.

Ausprobieren:
   Dim d As Double, c As Currency
   d = 2.3
   c = 2.3
   Print 1, c / 0.05, Int(c / 0.05)
   Print 2, d / 0.05, Int(d / 0.05)
   Print 3, CCur(2.3) / CCur(0.05), Int(CCur(2.3) / CCur(0.05))
   Print 4, 2.3@ / 0.05@, Int(2.3@ / 0.05@)

-Werner
Titel: Re: INT rechnet fehlerhaft
Beitrag von: flaite am 27.11.14 - 11:16:35
quasi mein Lieblingsthema.

Wird wahrscheinlich damit zusammenhängen, dass sich Fließkommazahlen wie Double binär nicht darstellen lassen. Für diese Darstellung existieren Standards wie IEEE 754 (try google).
Grundsätzliches Problem ist, dass die Anzahl der Fließkommazahlen gegen unendlich tendiert, der Rechner aber einen endlichen Raum an Speicher bereitstellt, um sie darzustellen.
Warum unendlich?
Einfache Zahlenreihe: 0.1, 0.01, 0.001, 0.0001, 0.00001, ...

Du kannst mit Rundungsoperationen gegen die Ungenauigkeiten ansteuern. Besser ist oft die Nutzung von nennen wir es "Festkommazahlen". Hier gibst Du bei der Deklaration an, wie viele Zahlen hinter dem Komma berücksichtigt werden. Bei Currency in LotusScript ist das implizit, afaik Darstellung bis 3 Ziffern hinter dem Komma und implizit hält das 5 Ziffern hinter dem Komma. Java bietet BigDecimal an. In Relationalen Datenbanken gibts dafür Numeric.