Du schreibst du willst nicht runden. Darum kommst du nicht rum, wenn du mit trunc arbeitest. trunc rundet immer gegen 0: Wenn der in e:extended gespeicherte Wert zwar nahe einer integer Zahl i liegt, aber etwas unter i, dann liefert trunc(e) den Wert i-1 zurück.
Du schreibst weiter oben im Code // e := d * 10.0; // hier ist der Wert immer noch richtig e=241. - Das stimmt nicht; da "betrügt" dich die
IDE.
Fall A: In e.frac ist nach e := d * 10.0;
1111000011111111111111111111111111111111111111111111111111 111111 gespeichert (gespeicherter Wert in e
240.
höchstdarstellbare Nachkommazahl)
Fall B: Wohingegen nach e := 241; in e.frac
1111000100000000000000000000000000000000000000000000000000 000000
gespeichert ist - also genau 241.
Da trunc gegen 0 rundet, wird im Fall A 240 (11110000) ausgegeben, im Fall B 241 (11110001).
Es gibt diverse Möglichkeiten, das Problem zu lösen (und viele Beiträge dazu in
DP).
Data.FmtBcd
Currency (Im "Mischbetrieb" mit extended und Co treten natürlich ähnliche Probleme auf)
Daran denken, dass extended unter
Win32 genauer ist als unter Win64 (extended=double) und damit nicht die gleichen "Rundungsprobleme" aftreten.
setroundmode - Rundungsverhalten der FPU steuern - zum Beispiel: setroundmode( rmUp );