Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 Uhr.
Seite 1 von 2  1 2      

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