Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dividieren durch gebrochene Zahlen (https://www.delphipraxis.net/94256-dividieren-durch-gebrochene-zahlen.html)

Coder 18. Jun 2007 22:21


Dividieren durch gebrochene Zahlen
 
ich möchte gerne durch gebrochne Zahlen dividieren.

Bsp: 56654 / 35.456
= 1597,86

Ist der Algo so richtig?


Delphi-Quellcode:
function real_teilen(valueue1: real; value2: real): real;
var x, y, z: real;
begin
  x := value / value2;
  y := x * 100;
  z := int(trunc(y));
  z := z / 100;
  result := z;
end;
oder kann man den noch verbessern?

Cyberbob 18. Jun 2007 22:36

Re: Dividieren durch gebrochene Zahlen
 
valueue1 würde ich noch durch value1 ersetzen

ich hätts so gemacht:
Delphi-Quellcode:
trunc((value1/ value2) * 100) / 100
als code also:

Delphi-Quellcode:
function real_teilen(value1: real; value2: real): real;
begin
  result := trunc((value1 / value2) * 100) / 100;
end;

fLaSh11 18. Jun 2007 22:43

Re: Dividieren durch gebrochene Zahlen
 
außerdem kannst du zusammenfassen: (selber typ!)
Delphi-Quellcode:
function real_teilen(value1, value2: real): real;

dizzy 19. Jun 2007 02:30

Re: Dividieren durch gebrochene Zahlen
 
Du willst offenbar auf 2 Stellen nach dem Komma runden, was Geldwerte vermuten lässt. Dafür eignet sich der Typ Currency ganz gut, da er intern auf Ganzzahlen basiert, und somit die bei Gleitkommawerten unvermeidlichen Rundungsfehler umgeht.
Alternativ kannst du auch selber intern immer mit den Werten mal 100 rechnen, und dann mit Ganzzahltypen, und nur für die Ausgabe durch 100 teilen um das Komma zu erhalten (oder gar per Stringoperationen einfügen).
Gleitkomma geht auch, aber rechne nicht damit bei 2.95/1.59 nachher genau 1.85 zurück zu bekommen. Du wirst nämlich bereits bei deinen Eingangszahlen sowas wie 2.9499999994 und 1.5900000000021 im Speicher haben, und etwas wie 1.850000013 als Ergebnis. Das liegt an der prinzipiellen Funktionsweise von Floats, und ist mit trunc(x*100)/100 nicht abstellbar.
Merken wirst du das zwar erst, wenn du ein paar Millionen Mal irgendwelche Rechungen durchgeführt hast, aber ich halte es für wichtig diesen Umstand immer im Hinterkopf zu haben.

Bei Festkommawerten (Anzahl Stellen nach dem Komma fix) lohnt es sich eigentlich immer intern mit skalierten Ganzzahlen zu rechnen. Allein schon, weil Ganzzahlarithmetik schneller von statten geht.

Gruss,
Fabian

oldmax 19. Jun 2007 05:43

Re: Dividieren durch gebrochene Zahlen
 
Hi
Wie wär's mit einer simplen z:=x/y - Lösung und zum Darstellen FormatFloat('#0.00',z); ? Rechenzeiten sollten an dieser Stelle glaub ich nicht unbedingt erwähnt werden.... :zwinker:
Gruß oldmax


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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