Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nachkommastellen vom Typ Real extrahieren und dann runden (https://www.delphipraxis.net/63418-nachkommastellen-vom-typ-real-extrahieren-und-dann-runden.html)

juergen 18. Feb 2006 15:01


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!

mkinzler 18. Feb 2006 15:04

Re: Nachkommastellen vom Typ Real extrahieren und dann runde
 
So müsste es gehen:
Delphi-Quellcode:
neuezahl := Trunc((Zahl - Trunc( Zahl)) * 100 +5)/100;

Klaus01 18. Feb 2006 15:44

Re: Nachkommastellen vom Typ Real extrahieren und dann runde
 
mit

Delphi-Quellcode:
function Frac(X: Extended): Extended;
sollte es auch gehen.

Anschliessend noch runden mit.

Delphi-Quellcode:
function RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
Grüße
Klaus

juergen 18. Feb 2006 15:56

Re: Nachkommastellen vom Typ Real extrahieren und dann runde
 
Hallo mkinzler,
irgendwie funktioniert das leider nicht.
Delphi-Quellcode:
a := strtofloat(InputA.text);
b := strtofloat(InputB.text);
c := a - b;
d := Trunc((c - Trunc(c)) * 100 +5)/100;
OutputC.text :=FloatToStr(p);
Wenn z.B. a := 2,10 und b := 8 dann bekomme ich bei einer Subtraktion als Ergebnis c = -0,85
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!

juergen 18. Feb 2006 16:12

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);

Khabarakh 18. Feb 2006 16:14

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?

juergen 18. Feb 2006 16:20

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

Khabarakh 18. Feb 2006 16:51

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.

juergen 18. Feb 2006 17:32

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

Khabarakh 18. Feb 2006 17:41

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.

Klaus01 18. Feb 2006 18:29

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:
if (zahl MOD 100 = 0) then
  ergebnis := zahl DIV 100
else
  if (zahl MOD 10 = 0) then
    ergebnis := zahl DIV 10;
damit würden aus 0,200 (*1000) -> 200 (DIV 100) -> 2
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

alzaimar 18. Feb 2006 19:01

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;

marabu 18. Feb 2006 19:42

Re: Nachkommastellen vom Typ Real extrahieren und dann runde
 
Will auch mitspielen:

Delphi-Quellcode:
uses
  Math;

function Decimals(e: Extended; count: Byte): Int64;
begin
  Result := Round(Frac(e) * Power(10, count));
end;
Grüße vom marabu

alzaimar 18. Feb 2006 19:56

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.

juergen 18. Feb 2006 22:13

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:

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.
Nööhhh, ich brauche - egal wie viele Nachkommastellen es gibt - davon nur die ersten 3 Stellen!
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 06:39 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