Rundungsfehler bei Division [gelöst]

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Rundungsfehler bei Division [gelöst]

Beitrag von AlterMann »

Guten Morgen

Ich versuche gerade einen Fehler zu finden, der in einem Lohnberechnungsprogramm zu unschönen (und falschen) Centbeträgen in den Folgerechnungen führt.
Zunächst lese ich aus einer MySQL-Datenbank den Wert für den Stundenlohn ein.
Dort ist dieser als DECIMAL(6,2) gespeichert und beträgt 9,86
zs wird daraufhin 986
izs ebenfalls
und nach der Division steht in europstd 9,8599999999999994

Code: Alles auswählen

 var izs : longint;
       zs, europstd : double;
... 
...
     zs := SQLQuery1.Fields[3].AsFloat*100;
     izs := Trunc (zs);
     europstd := izs / 100;
Was mach ich da falsch?
Danke für's lesen
Christian
Zuletzt geändert von AlterMann am Fr 31. Jul 2020, 09:10, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6208
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Rundungsfehler bei Division

Beitrag von af0815 »

Grunlegend nichts, das ist der internen Darstellung vin Zahlen geschuldet und immer wieder ein Thema. Es lassen sich nicht alle Zahlen exakt darstellen.
Grundlegend gibt es den Datentyp Currency deswegen.

Siehe auch
viewtopic.php?f=10&t=12890&hilit=currency
viewtopic.php?f=10&t=12742&hilit=currency
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 786
Registriert: Do 1. Jul 2010, 19:01

Re: Rundungsfehler bei Division

Beitrag von six1 »

versuche es mal so:

Code: Alles auswählen

var
 zs, europstd : currency;
 izs : longint;
begin
   zs := 9.86*100;
   izs := Trunc (zs);
   europstd := izs / 100;
   label1.caption:=floattostr(europstd);
end;         
Gruß, Michael

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Rundungsfehler bei Division

Beitrag von AlterMann »

Danke ihr beiden.
Das war die Lösung
:wink:
Früher war alles besser. Und aus Holz!

wp_xyz
Beiträge: 4885
Registriert: Fr 8. Apr 2011, 09:01

Re: Rundungsfehler bei Division [gelöst]

Beitrag von wp_xyz »

Warum rundest du mit Trunc()? Das schneidet zs*100 = 985.9999999999999999 brual nach der "5" ab. Nimmst du stattdessen Round so wird auf 986 aufgerundet.

AlterMann
Beiträge: 233
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Rundungsfehler bei Division [gelöst]

Beitrag von AlterMann »

War vorher (und ist jetzt auch wieder) Round().

Trunc() war nur einer (von vielen) Fehlversuchen ins Blaue.

Trotzdem Danke!
Früher war alles besser. Und aus Holz!

Antworten