AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Großen Float-Wert ohne Exponent darstellen?

Ein Thema von Ralf Kaiser · begonnen am 1. Jun 2015 · letzter Beitrag vom 1. Jun 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#1

Großen Float-Wert ohne Exponent darstellen?

  Alt 1. Jun 2015, 08:22
Delphi-Version: XE7
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
Ralf Kaiser
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

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

  Alt 1. Jun 2015, 08:40
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.
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#3

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

  Alt 1. Jun 2015, 09:10
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;
  Mit Zitat antworten Zitat
RoadR69

Registriert seit: 7. Nov 2013
17 Beiträge
 
Delphi 10 Seattle Professional
 
#4

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

  Alt 1. Jun 2015, 09:17
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 1. Jun 2015, 09:20
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

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

  Alt 1. Jun 2015, 09:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#7

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

  Alt 1. Jun 2015, 09:44
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.
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

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

  Alt 1. Jun 2015, 09:48
Und wie wäre der Wechsel der Einheit, z.b kg oder t anstelle von g zu verwenden? Oder geht es um Geldbeträge?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#9

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

  Alt 1. Jun 2015, 10:03
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Jun 2015 um 12:06 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 1. Jun 2015, 10:30
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:02 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