Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Großen Float-Wert ohne Exponent darstellen? (https://www.delphipraxis.net/185330-grossen-float-wert-ohne-exponent-darstellen.html)

Ralf Kaiser 1. Jun 2015 08:22

Delphi-Version: XE7

Großen Float-Wert ohne Exponent darstellen?
 
Halli Hallo,

Ich steh da gerade ein wenig auf dem Schlauch. Und zwar will ich einen großen Float-Wert (z.B. 1E28) ohne Exponent formatiert darstellen. Alle Formatierungsroutinen die ich bisher ausprobiert habe schreiben den Wert immer mit Exponent, also z.B 9,99999999999E27) egal welche Formatierungsparameter ich benutze.

Hat da jemand einen Tip?

Danke schon mal,
Ralf

Dejan Vu 1. Jun 2015 08:40

AW: Großen Float-Wert ohne Exponent darstellen?
 
Ich habe gerade kein Delphi, aber klappt "#,0" als Formatierungsparameter nicht?
Und wenn das nicht geht, vielleicht eine eigene kleine Routine?

Delphi-Quellcode:
Function ExtendedToString(v : Extended; ThousandSeparator : Char) : String;
var
  i,d : Integer;

Begin
  result :='';
  i:=0;
  while v>0.01 do begin
    d := Int(0.5+frac(v/10)*10);
    v := Trunc(v/10);
    Result := IntToStr(d)+Result;
    inc(i);
    if i mod 3=2 then
      Result := ThousandsSeparator+Result;
  end;
end;
Ungetestet.
'Int' soll den Nachkommaanteil abschnippeln und einen Integer liefern.
'Frac' soll nur den Nachkommaanteil liefern
'Trunc' soll den Nachkommaanteil abschnippeln und einen Extended liefern.

gammatester 1. Jun 2015 09:10

AW: Großen Float-Wert ohne Exponent darstellen?
 
Da trunc als Ergebnis int64 liefert ist die Routine für wirklich große Zahlen unbrauchbar, weiter ist d := int() nicht übersetzbar und für negative Werte ist der Resultstring leer. Hier eine modifizierte Routine
Delphi-Quellcode:
Function ExtendedToString(v : Extended; ThousandSeparator : Char) : String;
var
  i : Integer;
  d: extended;
  sign: string;
Begin
  if v<0 then begin
    v := -v;
    sign := '-';
  end
  else sign := '';
  Result :='';
  i:=0;
  while v>0.01 do begin
    d := int(0.5+frac(v/10)*10);
    v := int(v/10);
    Result := IntToStr(round(d))+Result;
    inc(i);
    if (i mod 3=2) and (ThousandSeparator<>#0) then
      Result := ThousandSeparator+Result;
  end;
  Result := sign+Result;
end;

RoadR69 1. Jun 2015 09:17

AW: Großen Float-Wert ohne Exponent darstellen?
 
also große Gleitkommazahlen ohne Exponent darstellen zu wollen macht meines Erachtens nicht viel Sinn, da dadurch eine mathematische Genauigkeit vorgegaukelt wird, die nicht existiert ...

http://docwiki.embarcadero.com/RADSt...ommaarithmetik

himitsu 1. Jun 2015 09:20

AW: Großen Float-Wert ohne Exponent darstellen?
 
Ganz so einfach ist das garnicht. Die ersten "signifikanten" Dezimalstellen kann man so noch nehmen, aber danach sind es praktisch nur noch Zufallswerte, welche auf Grund von Rundungsproblemen entstehen und da sollte ma besser eine 0 verwenden, auch wenn die genauso "falsch" ist, wie jeder andere Wert, aber besser als da "irgendwas" anzuzeigen ist die Null dennoch.

gammatester 1. Jun 2015 09:42

AW: Großen Float-Wert ohne Exponent darstellen?
 
Auf Codecentral gibt es das Paket Exact Float to String Routines von John Herbster
http://cc.embarcadero.com/Item/19421. Es liefert zB
Code:
 1E40=+9.999.999.999.999.999.999.783.686.092.270.256.259.072
 1E80=+100.000.000.000.000.000.000.898.856.000.223.432.128.731.007.703.742.207.457.776.729.552.965.073.551.491.072

Ralf Kaiser 1. Jun 2015 09:44

AW: Großen Float-Wert ohne Exponent darstellen?
 
Zitat:

Zitat von RoadR69 (Beitrag 1303754)
also große Gleitkommazahlen ohne Exponent darstellen zu wollen macht meines Erachtens nicht viel Sinn, da dadurch eine mathematische Genauigkeit vorgegaukelt wird, die nicht existiert ...

http://docwiki.embarcadero.com/RADSt...ommaarithmetik

In meinem Fall geht es nicht um Genauigkeit. Eigentlich könnte ich "Trunc()" nehmen aber das ist bei solch großen Werten nicht anwendbar.

Union 1. Jun 2015 09:48

AW: Großen Float-Wert ohne Exponent darstellen?
 
Und wie wäre der Wechsel der Einheit, z.b kg oder t anstelle von g zu verwenden? Oder geht es um Geldbeträge?

himitsu 1. Jun 2015 10:03

AW: Großen Float-Wert ohne Exponent darstellen?
 
Mit Big-Number-Bibliotheken oder ganz einfach mit einem BCD-Typen würde sich das Problem von ganz alleine Lösen, ohne daß man selber etwas machen muß.

Wenn es eine Datenbank gibt, dann einfach DB-seitig erledigen,
oder z.B. Delphi-Referenz durchsuchenData.FmtBcd, Delphi-Referenz durchsuchenData.FmtBcd.TBcd, Delphi-Referenz durchsuchenDoubleToBcd, Delphi-Referenz durchsuchenBcdToStr usw.

Bjoerk 1. Jun 2015 10:30

AW: Großen Float-Wert ohne Exponent darstellen?
 
Delphi-Quellcode:
function ExtendedToDecimal(Number: extended): string;
var
  FloatRec: TFloatRec;
  DecimalSeparatorPosition: integer;
begin
  FloatToDecimal(FloatRec, Number, fvExtended, 18, 9999);
  Result := FloatRec.Digits;
  if Result = '' then
    Result := '0'
  else
  begin
    if FloatRec.Exponent > 0 then
      Result := Result + StringOfChar(#48, FloatRec.Exponent - Length(Result))
    else
      if FloatRec.Exponent < 0 then
        Result := StringOfChar(#48, -FloatRec.Exponent) + Result;
    if FloatRec.Exponent < 0 then
      DecimalSeparatorPosition := 1
    else
      DecimalSeparatorPosition := FloatRec.Exponent + 1;
    if DecimalSeparatorPosition <= Length(Result) then
      Insert(DecimalSeparator, Result, DecimalSeparatorPosition);
    if DecimalSeparatorPosition = 1 then
      Result := '0' + Result;
    if FloatRec.Negative then
      Result := '-' + Result;
  end;
end;


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