Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Zwei Ganzzahlen zu Dezimalzahl zusammensetzen (https://www.delphipraxis.net/213807-zwei-ganzzahlen-zu-dezimalzahl-zusammensetzen.html)

Dalai 28. Sep 2023 13:03

Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Hallo, ich hätt da gern mal wieder ein Problem ;).

Gegeben sind zwei Zahlen, die zu einer Dezimalzahl zusammengesetzt werden sollen. Die eine Zahl ist festgelegt als 1, die andere ist frei definierbar. Beispiele:
Zahl1Zahl2Ergebnis
1551,55
199991,9999
101,0
11234567891,123456789
Vereinfacht gesagt soll der zweiten Zahl ein "1," vorangestellt werden. Für diese Operation gibt's bestimmt einen mathematischen Begriff.

Wichtiger ist aber die Frage, wie ich die Sache in Code umsetze. Bisher hab ich dies zusammengestöpselt:
Delphi-Quellcode:
var
  Zahl2: integer;
  Lsizescalingfactor: Double;
  Ldigits: integer;
begin
  Ldigits:= CountDigits(Zahl2);
  Lsizescalingfactor:= 1 + (Zahl2 / IntPower(10, Ldigits));
Es wird also die Anzahl der Stellen von Zahl2 gezählt und Zahl2 durch 10 hoch AnzahlStellen geteilt und am Ende 1 hinzuaddiert. Das funktioniert auch einwandfrei, aber geht das irgendwie einfacher?

Grüße
Dalai

zeras 28. Sep 2023 13:08

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Nimm doch einfach Zahl1 + Zahl2/10.


Oder verstehe ich das falsch?

Andreas13 28. Sep 2023 13:14

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Wie wäre es mit:
Delphi-Quellcode:
WriteLn(('1.' + Zahl2.ToString()).ToDouble);

Neutral General 28. Sep 2023 13:19

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Zitat:

Zitat von zeras (Beitrag 1527490)
nimm doch einfach zahl1 + zahl2/10.


Oder verstehe ich das falsch?

1 + 55/10 = 1 + 5,5 = 6,5

Zum eigentlichen Problem: Wenns jetzt keine Hausaufgaben sind die auf ne bestimmte Weise gelöst werden sollen würd ich einfach
Delphi-Quellcode:
StrToFloat(IntToStr(Zahl1) + ',' + IntToStr(Zahl2))

machen. Nicht elegant, aber erfüllt seinen Zweck

Andreas13 28. Sep 2023 13:24

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
... oder bei beliebiger erster Integerzahl:
Delphi-Quellcode:
VAR
  Int_1, Int_2: Integer;
  Dezimal: Double;

Begin
  Dezimal:= (Int_1.ToString + '.' + Int_2.ToString).ToDouble;

Neutral General 28. Sep 2023 13:26

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Mathematische Lösung:
Delphi-Quellcode:
uses
  Math;

function NumbersToFloat(N1, N2: Integer): Double;
begin
  Result := N1 + N2 / Power(10, Floor(Log10(N2) + 1));
end;

Uwe Raabe 28. Sep 2023 13:39

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Ich weiß ja jetzt nicht, wie CountDigits implementiert ist, aber man kann das auch gleich mit der Berechnung verbinden:
Delphi-Quellcode:
procedure Main;
var
  zahl2: Double;
begin
  for var I in TArray<Integer>.Create(55, 9999, 0, 123456789) do begin
    zahl2 := I;
    while zahl2 >= 1.0 do
      zahl2 := zahl2/10;
    zahl2 := zahl2 + 1.0;
    Writeln(Format('%g', [zahl2], TFormatSettings.Invariant));
  end;
end;

Gausi 28. Sep 2023 13:52

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Kann die zweite Zahl auch führende Nullen haben, so dass das gewünschte Ergebnis etwas wie "1,00042" wäre? Dann würden sämtliche Ansätze, die Zahl2 als Integer behandeln (und nicht als String) schief laufen. Nur so ein Gedanke. :wink:

himitsu 28. Sep 2023 13:58

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Technisch gesehn, entspricht das doch ganz grob in etwa dem, wie Delphi der Computer die Fließkommazahlen speichert.
https://de.wikipedia.org/wiki/IEEE_754

Dalai 28. Sep 2023 14:27

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Zitat:

Zitat von Neutral General (Beitrag 1527493)
Wenns jetzt keine Hausaufgaben sind die auf ne bestimmte Weise gelöst werden sollen würd ich einfach
Delphi-Quellcode:
StrToFloat(IntToStr(Zahl1) + ',' + IntToStr(Zahl2))

Nein, keine Hausaufgabe. Die Umwandlung mittels String kam mir auch in den Sinn, aber das Problem ist ja immer die Abhängigkeit vom im System eingestellten Dezimaltrennzeichen. Daher hab ich das gleich verworfen, auch wenn der Weg über Strings den Vorteil hätte, dass Zahl2 führende Nullen haben kann und damit ein Ergebnis wie 1,005 möglich ist. Das ist aber aktuell keine Voraussetzung.

Zitat:

Zitat von Gausi (Beitrag 1527499)
Kann die zweite Zahl auch führende Nullen haben, so dass das gewünschte Ergebnis etwas wie "1,00042" wäre?

Nein, die Zahlen sind immer Ganzzahlen und als Integer definiert.

Uwes Code hat für mich am meisten Charme. Einfacher und verständlicher Code :thumb:. Dankeschön! Die Funktion CountDigits hab ich von hier: https://stackoverflow.com/a/30016222

Grüße
Dalai

himitsu 28. Sep 2023 14:32

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Zitat:

Zitat von Dalai (Beitrag 1527501)
aber das Problem ist ja immer die Abhängigkeit vom im System eingestellten Dezimaltrennzeichen. Daher hab ich das gleich verworfen,

Entweder abfragen, welches Zeichen das aktuell ist
Delphi-Referenz durchsuchenFormatSettings.DecimalSeparator

oder der Funktion das Zeichen mitgeben, welches verwendet werden soll.
Delphi-Referenz durchsuchenStrToFloat + Delphi-Referenz durchsuchenTFormatSettings

Neutral General 28. Sep 2023 14:36

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Zitat:

Zitat von Dalai (Beitrag 1527501)
Die Umwandlung mittels String kam mir auch in den Sinn, aber das Problem ist ja immer die Abhängigkeit vom im System eingestellten Dezimaltrennzeichen. Daher hab ich das gleich verworfen, auch wenn der Weg über Strings den Vorteil hätte, dass Zahl2 führende Nullen haben kann und damit ein Ergebnis wie 1,005 möglich ist. Das ist aber aktuell keine Voraussetzung.

Delphi-Quellcode:
StrToFloat(IntToStr(Zahl1) + FormatSettings.DecimalSeparator + IntToStr(Zahl2))


Edit: Ups nicht gesehn dass himitsu schneller war

Uwe Raabe 28. Sep 2023 14:55

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Das mit den führenden Nullen ist unter der Annahme, dass zahl2 ein Integer ist, eh nicht möglich. Dazu müsste zahl2 schon als string vorliegen.

dummzeuch 28. Sep 2023 17:37

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Zitat:

Zitat von Dalai (Beitrag 1527501)
das Problem ist ja immer die Abhängigkeit vom im System eingestellten Dezimaltrennzeichen. Daher hab ich das gleich verworfen, auch wenn der Weg über Strings den Vorteil hätte, dass Zahl2 führende Nullen haben kann und damit ein Ergebnis wie 1,005 möglich ist. Das ist aber aktuell keine Voraussetzung.

Delphi-Quellcode:
function Combine(_Zahl1, _Zahl2: integer): Double;
var
  err: integer;
begin
  Val(Format('%d.%d', [_Zahl1, _Zahl2]), Result, err);
end;
oder wenn die Zahlen als Strings eingelesen werden (also führende Nullen möglich sind):

Delphi-Quellcode:
function Combine(const _Zahl1, _Zahl2: string): Double;
var
  err: integer;
begin
  Val(Format('%s.%s', [Zahl1, Zahl2]), Result, err);
end;
Funktioniert unabhängig vom Dezimaltrennzeichen.

Dalai 28. Sep 2023 18:51

AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
 
Mittlerweile hab ich die selbst gestellte Aufgabe ganz anders gelöst, so dass gar kein Faktor mehr errechnet werden muss. Ich hätte wohl gleich über die Problematik gezielter und intensiver nachdenken sollen. Naja, hinterher ist man immer schlauer :).

Nur der Vollständigkeit halber:
Das Ziel war, Dateigrößen zu errechnen, die beim Codieren von (binären) Dateien entstehen, ohne die eigentliche Codierung durchzuführen (weil rechen- und damit zeitintensiv). Zu Beginn dachte ich, die üblichen 33% bis 37% reichen dafür nicht aus, denn meine Tests ergaben 41-43% größere Dateien. Dann fiel mir auf, dass diese Base64 codierten Dateien noch einen Header und Footer haben. Inzwischen hab ich einen brauchbaren Algorithmus gefunden, der im Maximum einen 2 Byte zu kleinen Wert ergibt, in der Mehrzahl der Fälle aber korrekt ist. Das ist für den Zweck akzeptabel.

Anyway, danke an alle Beteiligten für die Denkanstöße! :dp:.

Grüße
Dalai


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