AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

kaufmännisch auf 0,5 oder 1 runden

Ein Thema von juergen · begonnen am 20. Mai 2008 · letzter Beitrag vom 26. Mai 2008
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:03
Hallo zusammen,

im Moment verwende ich nachfolgendes, weil am genauesten:
JasonDX's Vorschlag:
round((StrToFloat(s) * 2 + 0.00000000000001)) / 2) Edit1.Text:= '12,4999999999999999999' -> 12,5 -> erst ab der 19.Stelle falsch

Marc seine Funktion:
myround(StrToFloat(Edit1.Text)) Edit1.Text:= '12,2499999999999999' -> 12,5 -> ab der 16.Stelle falsch

grenzgaenger seine Funktion:
trunc((StrToFloat(Edit1.Text)) * 2 + 0.5) / 2 Edit1.Text:= '12,4999999999999999' -> 12,5 -> ab der 16.Stelle falsch

Prinzipiell lässt sich diese Ungenauigkeit mit diesem Konzept von Stringkonvertierung und Real wohl nicht lösen.
Ich vermute man müsste expliziet nur mit Integer und dessen Funktionen arbeiten um genauere Ergebnisse zu erreichen.

Da ich keine Summierungen verwende wo sich dann die evtl. Ungenauigkeiten summieren könnten, kann ich damit leben.

Danke an alle für die Unterstützung!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#12

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:12
wenn du genaue ergebnisse haben möchtest, darfst du keine gleitkommazahlen (single, double, real, extented, float, etc. pp.) verwenden. hier kommen nur integer werte in betracht. also, z.b. integer, word, longint, int64, currency.

weshalb rechnest du die zahlen nicht erst in ein datenformat um, welches auch einigermassen valide ist? ansonsten hast du immer die probleme, dass sie in die eine oder andere richtung, willkürlich, kippen. damit wirst du nie glücklich werden...

wenn du auf assembler ebene schaust, schau dir mal "binary coded decimal" (BCD) an. das format wurde extra erfunden um die rundungsprobleme zu vermeiden.. die CPU hat hierfür auch einen extra modus ... (COBOL kann das von haus auf..., 'ne bilanz macht einfach keinen spass, wenn aktiva und passiva nicht aufgehen )
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:19
Zitat von juergen:
Hallo zusammen,

im Moment verwende ich nachfolgendes, weil am genauesten:
JasonDX's Vorschlag:
round((StrToFloat(s) * 2 + 0.00000000000001)) / 2) Edit1.Text:= '12,4999999999999999999' -> 12,5 -> erst ab der 19.Stelle falsch

Marc seine Funktion:
myround(StrToFloat(Edit1.Text)) Edit1.Text:= '12,2499999999999999' -> 12,5 -> ab der 16.Stelle falsch

grenzgaenger seine Funktion:
trunc((StrToFloat(Edit1.Text)) * 2 + 0.5) / 2 Edit1.Text:= '12,4999999999999999' -> 12,5 -> ab der 16.Stelle falsch

Prinzipiell lässt sich diese Ungenauigkeit mit diesem Konzept von Stringkonvertierung und Real wohl nicht lösen.
Ich vermute man müsste expliziet nur mit Integer und dessen Funktionen arbeiten um genauere Ergebnisse zu erreichen.

Da ich keine Summierungen verwende wo sich dann die evtl. Ungenauigkeiten summieren könnten, kann ich damit leben.

Danke an alle für die Unterstützung!
haste kein Vertrauen zur primitivsten Version? *sfg* s.o.
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#14

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:27
Zitat von Der.Kaktus:
haste kein Vertrauen zur primitivsten Version? *sfg* s.o.
denke, das hat nix mit vertrauen zu tun, so lange er keinen datentyp nimmt, welcher keine rundungsfehler erzeugt, wird er immer probleme haben. nicht umsonnst sollte man die floats vermeiden...
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:31
Zitat von grenzgaenger:
Zitat von Der.Kaktus:
haste kein Vertrauen zur primitivsten Version? *sfg* s.o.
denke, das hat nix mit vertrauen zu tun, so lange er keinen datentyp nimmt, welcher keine rundungsfehler erzeugt, wird er immer probleme haben. nicht umsonnst sollte man die floats vermeiden...
na da sagen wir mal nix gelle ?
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#16

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:35
sehe grad, dass delphi einen eigenen BCD datentyp mit an board hat TBcd
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#17

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:37
Zitat von Der.Kaktus:
Zitat von grenzgaenger:
Zitat von Der.Kaktus:
haste kein Vertrauen zur primitivsten Version? *sfg* s.o.
denke, das hat nix mit vertrauen zu tun, so lange er keinen datentyp nimmt, welcher keine rundungsfehler erzeugt, wird er immer probleme haben. nicht umsonnst sollte man die floats vermeiden...
na da sagen wir mal nix gelle ?
wenn juergen das für sich privat macht, ist das in ordnung. wenn allerdings kunden sein programm nehmen sollen, wird es ihm irgendwann um die ohren fliegen, wenn er mit groben approximationen arbeitet, wie im vorliegenden post... aber man gönt sich ja sonst nix ...
  Mit Zitat antworten Zitat
Benutzerbild von Der.Kaktus
Der.Kaktus

Registriert seit: 22. Jan 2008
Ort: Erfurt
958 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 17:48
@grenzgaenger

Jep, son Rechnungslegungsprogramm, was net richtig rundet, kommt net so gut beim Kunden.*fg*
Gruss Kaki

Repeat Until true=false;
  Mit Zitat antworten Zitat
bit4bit

Registriert seit: 14. Jun 2006
Ort: Köln
25 Beiträge
 
#19

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 20:23
Grundsätzlich würde ich das ursprüngliche Problem so lösen :

xr := trunc(x * 20 + 5) / 20
Dein Anwendungsfall muss aber IMHO anders gelöst werden!

Laut Gesetz ...

BUrlG § 5 Teilurlaub

Absatz 2 : Bruchteile von Urlaubstagen, die mindestens einen halben Tag ergeben, sind auf volle Urlaubstage aufzurunden.

... werden also Werte von x,5 bis x,999999... auf x+1 aufgerundet !

Von kaufmännischem Runden ( schon gar nicht auf halbe Tage ) steht da nix.

Man kann dem Arbeitnehmer natürlich mehr Urlaub geben als ihm eigentlich zusteht, wenn z.B. einen Anspruch von x,000000001 bis x,499999... auf x,5 aufgerundet würde:

xr := trunc(x * 20 + 9) / 20 Gesetzlich müsste man tatsächlich z.B. nur 0,1 Tage Urlaub gewähren *lol*

Übrigens: Dein Beispiel mit dem 15. Mai ergibt nur einen Urlaubsanspruch von 16,333... Tagen und nicht 17,672131147541 Tage , weil angebrochene Monate nicht zählen!
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.174 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: kaufmännisch auf 0,5 oder 1 runden

  Alt 25. Mai 2008, 21:32
@ bit4bit,
8)
Für deine Beispiele hast du Recht.
Da mein "Urlaubsrechner" aber nicht nur für Angestellte/ Beamte gelten soll, sondern vorwiegend im industriellen Bereich, musste ich alle möglichen Varianten abdecken...
Zur Veranschaulichung habe ich das Programm mal angehängt.

Ps.:
Angewandtes Tarifrecht...
Es ist erstaunlich wieviel Spielraum/ Interpretation Gesetzestext in der Praxis so zulässt.
Angehängte Dateien
Dateityp: zip urlaubsrechner_159.zip (584,3 KB, 7x aufgerufen)
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz