Zahlen mit beliebiger Genauigkeit dividieren |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
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 < 0) then
Result := '-'
else
Result := '';
len := -1;
repeat
if (len = 0) then
Result := Result + DecimalSeparator;
Result := Result + IntToStr(Abs(ADividend div ADivisor));
ADividend := (ADividend mod ADivisor) * 10;
Inc(len);
until (ADividend = 0) or (len >= 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
'''Aufruf'''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;
- Lottozahlen generieren
- Umrechnung in verschiedene Zahlensysteme
- Nur Zahleneingaben zulassen
- Primzahlen erkennen
- Quersumme errechnen
- Zahl bis zu einer bestimmten Stelle runden
- Punkt in einer Zahl durch Komma ersetzen
- Integerzahlen in römische Zahlen umwandeln
- Dezimalzahl nach Hexadezimal
- Hexadezimal nach Dezimal