![]() |
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 |
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:
Ungetestet.
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; 'Int' soll den Nachkommaanteil abschnippeln und einen Integer liefern. 'Frac' soll nur den Nachkommaanteil liefern 'Trunc' soll den Nachkommaanteil abschnippeln und einen Extended liefern. |
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; |
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 ...
![]() |
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.
|
AW: Großen Float-Wert ohne Exponent darstellen?
Auf Codecentral gibt es das Paket Exact Float to String Routines von John Herbster
![]()
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 |
AW: Großen Float-Wert ohne Exponent darstellen?
Zitat:
|
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?
|
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. ![]() ![]() ![]() ![]() |
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 04:08 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