Beiträge durchsuchen

Zahlen mit beliebiger Genauigkeit dividieren

Sollen zwei Zahlen dividiert werden, geht das im Normalfall nicht beliebig genau. Das Problem bei den Fließkomma-Datentypen von Object-Pascal ist deren begrenzte Größe. Spätestens ab der 15. von 0 verschiedenen Stellen wird das Ergebnis ungenau. Man sagt, es sind 15 signifikante Stellen.Mit Hilfe dieser Funktion können zwei Integerzahlen nun mit beliebiger Genauigkeit dividiert werden – das Ergebnis ist dann ein String:

function StringDivision(ADividend, ADivisor: Integer; const ADecimalPlaces: Cardinal): string;
var
  len: Integer;
begin
  if (ADividend xor ADivisor = ADecimalPlaces);
end;

Der erste Parameter entspricht dem Dividend, der zweite dem Divisor.Mit dem dritten Parameter kann die maximale Anzahl an Kommastellen angegeben werden.“’Erklärung“’Weil es in Delphi keinen Datentyp gibt, mit dem sich eine beliebig genaue Division durchführen lässt, wird hier immer nur ein Teil dividiert. Um das Ergebnis darzustellen, wird ein String benutzt. Dieser ist zwar auch nur begrenzt groß (maximal ca. 4 Milliarden Stellen), reicht aber bei weitem aus.Beim teilweisen Dividieren wird nach dem Verfahren vorgegangen, welches in der Grundschule gelernt wurde.Bei der Division mit negativen Zahlen muss beachtet werden, dass der Quotient genau dann negativ ist, wenn der Dividend und Divisor unterschiedliche Vorzeichen haben. Das wird mit der folgenden Zeile geprüft:

 if (ADividend xor ADivisor < 0) then

So kann die Funktion aufgerufen werden:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := StringDivision(100, 3, 20); //Entspricht "100 / 3" mit 20 Stellen nach dem Komma. Das Ergebnis lautet 
'33,33333333333333333333'.
end;