![]() |
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:
Wichtiger ist aber die Frage, wie ich die Sache in Code umsetze. Bisher hab ich dies zusammengestöpselt:
Delphi-Quellcode:
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?
var
Zahl2: integer; Lsizescalingfactor: Double; Ldigits: integer; begin Ldigits:= CountDigits(Zahl2); Lsizescalingfactor:= 1 + (Zahl2 / IntPower(10, Ldigits)); Grüße Dalai |
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Nimm doch einfach Zahl1 + Zahl2/10.
Oder verstehe ich das falsch? |
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Wie wäre es mit:
Delphi-Quellcode:
WriteLn(('1.' + Zahl2.ToString()).ToDouble);
|
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Zitat:
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 |
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; |
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; |
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; |
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:
|
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Technisch gesehn, entspricht das doch ganz grob in etwa dem, wie Delphi der Computer die Fließkommazahlen speichert.
![]() |
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Zitat:
Zitat:
Uwes Code hat für mich am meisten Charme. Einfacher und verständlicher Code :thumb:. Dankeschön! Die Funktion CountDigits hab ich von hier: ![]() Grüße Dalai |
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Zitat:
![]() oder der Funktion das Zeichen mitgeben, welches verwendet werden soll. ![]() ![]() |
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Zitat:
Delphi-Quellcode:
StrToFloat(IntToStr(Zahl1) + FormatSettings.DecimalSeparator + IntToStr(Zahl2))
Edit: Ups nicht gesehn dass himitsu schneller war |
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.
|
AW: Zwei Ganzzahlen zu Dezimalzahl zusammensetzen
Zitat:
Delphi-Quellcode:
oder wenn die Zahlen als Strings eingelesen werden (also führende Nullen möglich sind):
function Combine(_Zahl1, _Zahl2: integer): Double;
var err: integer; begin Val(Format('%d.%d', [_Zahl1, _Zahl2]), Result, err); end;
Delphi-Quellcode:
Funktioniert unabhängig vom Dezimaltrennzeichen.
function Combine(const _Zahl1, _Zahl2: string): Double;
var err: integer; begin Val(Format('%s.%s', [Zahl1, Zahl2]), Result, err); end; |
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 22:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz