![]() |
Nachkommastellen vom Typ Real extrahieren und dann runden
Hallo zusammen,
habe jetzt schon einiges gesucht, wohl aber nicht die richtigen Suchbegriffe verwendet... :( Ich möchte alle Nachkommstellen einer Realzahl "extrahieren". Dieser "extrahierter" Wert soll dann auf 2 Stellen gerundet werden. (kaufmännisch, also von 0...4,999... abrunden und ab 5.0 dann aufrunden) Kann mir hier jemand weiterhelfen? Vielen Dank schon mal vorab! |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
So müsste es gehen:
Delphi-Quellcode:
neuezahl := Trunc((Zahl - Trunc( Zahl)) * 100 +5)/100;
|
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
mit
Delphi-Quellcode:
sollte es auch gehen.
function Frac(X: Extended): Extended;
Anschliessend noch runden mit.
Delphi-Quellcode:
Grüße
function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
Klaus |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Hallo mkinzler,
irgendwie funktioniert das leider nicht.
Delphi-Quellcode:
Wenn z.B. a := 2,10 und b := 8 dann bekomme ich bei einer Subtraktion als Ergebnis c = -0,85
a := strtofloat(InputA.text);
b := strtofloat(InputB.text); c := a - b; d := Trunc((c - Trunc(c)) * 100 +5)/100; OutputC.text :=FloatToStr(p); Ich benötige aber als Ergebnis die 9. -> c = 5,9 Oder a:= 2,10 und b := 8,8888 -> c = -6,7888 Ich benötige maximal 2 Nachkommstellen, in diesem Beispiel also 79 .... @ Klaus! Aaaahhhhhh, frac scheint genau das zu sein was ich suche. Vielen Dank! |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Leider zu früh gefreut. :cry:
Beim Beispiel 2,10 - 8 = -5,9 liefert mir frac -> -0,9. Ich brauch aber die 9 Ehrlich gesagt weiß ich hier gar nicht was mir frac liefert, so wie es in der OH beschrieben ist, müsste doch eigentlich dort auch die 9 als Ergebnis rauskommen :?: ich verwenende das folgendermaßen:
Delphi-Quellcode:
a := strtofloat(InputA.text);
b := strtofloat(InputB.text); c := a - b; p:= frac (c) ; OutputC.text :=FloatToStr(p); |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Wie soll der Computer denn die 9 berechnen? Nur zur Sicherheit: Bei 1,234 bräuchtest du 234 (als Integer) als Ergebnis?
|
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Hallo Sebastian,
in deinem Beispiel bräuchte ich als Ergebnis --> 23. Wie gesagt, ich benötige die Nachkommastellen auf 2 Stellen kaufm. gerundet. Gruß Jürgen |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Hmm, aber als Integer (bzw. Byte)?
1,23 -> 23 und 1,2 -> 20 wäre möglich, aber was du verlangst, kann aufgrund der Ungenauigkeit der Fließkommazahlen nicht funktionieren. |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
also als Byte-Wert würde mir ja reichen.
Ich denke das es doch möglich sein muss bis zu 3 Zahlen hinter dem Komma "heraus zu selektieren"... Wenn es 3 Zahlen sind diese dann zu runden auf 2 Zahlen, wenn es nur 2 Zahlen sind braucht nicht gerundet werden, wenn es nur eine Zahl hinter dem Komma ist braucht damit auch nichts gemacht werden. Vielleicht hatte ich mich auch nur umständlich ausgedrück? Grüsse Jürgen |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Was ich geschrieben habe, stimmt nicht so ganz. Durch die Ungenauigkeit ist es natürlich nicht möglich, eine Anzahl der Nachkommastellen zu ermitteln, aber wenn als letzte Stelle eine 0 entsteht, kann man sie ja einfach abschneiden.
Du benutzt also Frac und RoundTo, wandelst das Ergebnis per Format oder FloatToStrF in einen String mit 2 Nachkommastellen um, extrahierst die Stellen ab dem Komma und entfernst ggf. eine hintenstehende 0. |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
wenn Du die letzten 3 Ziffern hinter dem Komma haben möchtest.
muss der Restwert mit 1000 multipliziert werden. aus 0,2 werden 200 aus 0,21 werden 210 aus 0,234 werden 234 um zu prüfen ob der Wert eine Zahl ist die ganzzahlig durch 100 teilbar ist
Delphi-Quellcode:
damit würden aus 0,200 (*1000) -> 200 (DIV 100) -> 2
if (zahl MOD 100 = 0) then
ergebnis := zahl DIV 100 else if (zahl MOD 10 = 0) then ergebnis := zahl DIV 10; aus 0,21 (*1000) -> 210 (DIV 10) -> 21 aus 0,212 (*1000) -> 212 -> 212 negative Zahlen kann man vorher mit abs in positive wandeln. Grüße Klaus |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Oder so;
Delphi-Quellcode:
Function ExractFractionalPart (aValue : Extended) : Int64;
Const ccMaxDigits = 100000000000; // Weiss nicht, ob das reicht Begin Result := Trunc (ccMaxDigits * Fract (aValue)); // z.b. : 1.23 => 230000000 While (Result>0) And (Result mod 10 = 0) do // Solange <>0 und die letzte Stelle 0 ist, wegschnippeln Result := Result div 10; End; |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Will auch mitspielen:
Delphi-Quellcode:
Grüße vom marabu
uses
Math; function Decimals(e: Extended; count: Byte): Int64; begin Result := Round(Frac(e) * Power(10, count)); end; |
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
Nich schlecht. Weiss er denn, wie viele Nachkommastellen er haben will? Ich hab das so verstanden, das er sie Alle will, ohne zu zählen: 1.2345 => 2345. 1.2345678 ==> 2345678.
|
Re: Nachkommastellen vom Typ Real extrahieren und dann runde
@all,
also erst einmal vielen Dank ob der vielen, wirklich interessanten Antworten! Ich denke ich fange mit marabus Vorlage an ;-) Zitat:
Diese muss ich dann auf 2 Stellen runden, von daher ist marabus Vorschlag etwas "überladen" :-D Allen eine gute Nacht und einen schönen Sonntag! Grüsse Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 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-2025 by Thomas Breitkreuz