Autor Beitrag
MaPsTaR
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: Di 29.06.10 11:28 
Hallo,

ich schreibe zurzeit an einem Kassenprogramm (oder wie auch immer man das bezeichnen kann).
Dafür gibt es die Möglichkeit Einheiten anzulegen, wobei ein Mindestwert einzugeben ist.

Das funktioniert auch alles super...

Jetzt habe ich aber das Problem, dass ich beim Eintragen eines Artikels auf die Rechnung überprüfen will, ob die eingegebene Anzahl ein Vielfaches des Mindestwertes der jeweiligen Einheit ist.

Habe es so probiert, das arbeitet aber aufgrund der "Rundungsfehler" bei reellen Zahlen nicht immer zuverlässig.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    Unity := RoundTo(AppMgr.Prices.GetArtUnityData(AppMgr.Prices.GetArtUnity(ArtID)).Minimum, -2);
    ArtAdded := RoundTo(StrToFloatDef(LCount.Text, 1) / Unity, -2);
    if RoundTo(ArtAdded * Unity, -2) <> StrToFloatDef(LCount.Text, 1
    then
    begin
      ArtID := 0;
      ArtAdded := -1;
    end;

Obwohl ich die Werte auf zwei Nachkommastellen runde, arbeitet Delphi mit x Stellen(z.B. 0,01 = 0,0099999997765). Und dadurch entsteht dann natürlich der Fehler.

Habe ich vielleicht etwas übersehen oder kennt jemand eine andere Möglichkeit, um zu überprüfen ob eine Zahl ein Vielfaches einer reellen Zahl ist?

Gruß MaPsTaR

_________________
Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Di 29.06.10 11:36 
vielleicht so ?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Function IsMultipart(v1,v2:Double;Var part:integer):Boolean;
begin
  Result := Round(v1*100mod Round(v2*100)=0;
  if Result  then part := Round(v1*100DIV Round(v2*100else Part := 0;

end;


Moderiert von user profile iconChristian S.: Delphi-Tags repariert

Für diesen Beitrag haben gedankt: MaPsTaR
MaPsTaR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: Di 29.06.10 11:44 
:autsch: :autsch: :autsch:

Dankeschön, Problem ist damit gelöst.

_________________
Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Di 29.06.10 12:30 
Wenn, dann Faktor 10000: Im Finanzwesen wird üblicherweise mit 4 Nachkommastellen gerechnet.

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
MaPsTaR Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: Di 29.06.10 14:24 
Ist denn das bei der Anzahl der Artikel auch relevant?

Aber trotzdem danke für den Hinweis!!

_________________
Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Di 29.06.10 19:00 
Hi :)

Besonders bei vielen Artikeln aber dann bis zum Schluss mit maximaler Genauigkeit rechnen, nicht wie oben bei jedem Schritt runden. ;)

Je nach Anwendungszweck, würde ich die Anzahl der Nachkommastellen, auf die Beträge gleich sein müssen, anpassen. Will der Kunde wissen, ob er genau passend mit 5-Cent-Münzen zahlen kann, wären wohl 2 Nachkommastellen angebracht. Kauft dagegen jemand ein 1000000€-Auto, kannst du den Faktor wahrscheinlich ruhig mal auf 10^-4, statt 1000 oder 100, stellen. :)

lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)