![]() |
Anzahl der Nachkommastellen von Double ermitteln
Hallo,
ich würde gerne von einer Double-Zahl ermitteln, wieviele Nachkommastellen diese hat. Hört sich leichter an als es dann tatsächlich ist - oder ich sitze auf dem Schlauch. Bisher habe ich hierfür folgenden Code gehabt, der zunächst auch funktioniert hat:
Delphi-Quellcode:
Rufe ich die Methode nun wie folgt auf:
function GetDecimalPlaces(const AValue: Double): Integer;
var fFracValue : Double; begin Result := 0; fFracValue := Frac(AValue); if fFracValue > 0 then fFracValue := SimpleRoundTo( fFracValue + 0.00000000001, -10) else if fFracValue < 0 then fFracValue := SimpleRoundTo( fFracValue - 0.00000000001, -10); if fFracValue = 0 then exit; if fFracValue < 0 then Result := Length(FormatFloat('0.#################',fFracValue))-3 else Result := Length(FormatFloat('0.#################',fFracValue))-2; end; GetDecimalPlaces(4512985.95); dann erhalte ich: 17. Gewünscht wäre: 2 Ich denke, das passiert wegen der Umwandlung zwischen Double und Extended Zahlen. Meine Frage ist: Hat einer eine Idee, wie ich zuverlässig von beliebigen Double Werten die Anzahl der Nachkommastellen ermitteln kann? Danke. |
AW: Anzahl der Nachkommastellen von Double ermitteln
Split + Delemiter = '.' bzw. ','
Result = länge des Strings vom höchsten Array Element. gruss |
AW: Anzahl der Nachkommastellen von Double ermitteln
Das Thema ist aufgrund der internen Darstellung von Gleitkommazahlen nicht ganz ungefährlich. Aber
![]() ![]() Sherlock |
AW: Anzahl der Nachkommastellen von Double ermitteln
Hier ein paar hilfreiche Routinen (Exact Float to String Routines etc.)
![]() |
AW: Anzahl der Nachkommastellen von Double ermitteln
Willst Du wirkliche die genaue Darstellung von Double/Extended haben? Die können ziemlich viele Nachkommastellen haben. Hier für Deine Zahl 4512985.95:
Berechnet mit meinem MPArith( ![]()
Code:
oder mit John Herbster's ExactFloatToStr_JH0 -- Exact Float to String Routines (
Test of MPArith V1.37.12 (31/32 bit) [mp_rcalc] (c) W.Ehrhardt 2008-2018
Karatsuba cutoffs: mul/sqr = 16/32 Toom-3, BZ cutoffs: mul/sqr = 32/64, div = 32 Type "?<enter>" to get some info about commands, "\q" or "quit" to end. Current bit precision = 240 (max:120000), decimal precision = 72.2 [D]:=> x=4512985.95 X = 4512985.95 [D]:=> asx(x) Result = 4512985.9499999999998181010596454143524169921875 [D]:=> asd(x) Result = 4512985.950000000186264514923095703125 ![]() 4.512.985,949.999.999.999.818.101.059.645.414.352. 416.992.187.5 Schau Dir damit mal 'smallest double' an, das hat über 750 signifikante Nachkommastellen! |
AW: Anzahl der Nachkommastellen von Double ermitteln
Danke für eure Antworten.
Nicht die exakte Darstellung. Nur die Anzahl der NS meiner gerundeten Double Zahl. Also bei der Zahl 4512985.95 möchte ich 2 erhalten. => 2NS. Bei der Zahl 0.00000023 möchte ich 8 erhalten. => 8NS Dieser Code funktioniert schon mal ganz gut. Danke für den Link! In meinem Fall werden die Werte max. 8-10 NS haben.
Delphi-Quellcode:
function GetDecimalPlaces(AValue: Double): Integer;
const e = 0.0000000001; var r: Extended; begin Result := 0; if AValue < 0 then AValue := AValue * -1; r := Int(AValue); while ((Frac(AValue) <> 0) and ((AValue - r) > e)) do begin Inc(Result); AValue := AValue * 10; r := Int(AValue+e); end; end; |
AW: Anzahl der Nachkommastellen von Double ermitteln
Warum so kompliziert?
Ein einfaches Splitten.
Delphi-Quellcode:
function GetLength(Value: Double): Integer;
var so: Integer; tResult: string; begin tResult := FloatToStr(ABS(Value)); so := InStr(1, tResult, ','); if (so <> 0) then begin Result := Length(MidStr(tResult, so + 1, Length(tResult))); end; end;
Delphi-Quellcode:
Bei mir sind es 2 nicht mehr nicht weniger.
LenValue := GetLength(4512985.95);
gruss |
AW: Anzahl der Nachkommastellen von Double ermitteln
Zitat:
|
AW: Anzahl der Nachkommastellen von Double ermitteln
Zitat:
GetLength(0.00000023) schon an seine Grenzen... |
AW: Anzahl der Nachkommastellen von Double ermitteln
Zitat:
Zitat:
Danach ist es so wie @gammatester sagte.. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 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 by Thomas Breitkreuz