![]() |
Trunc() probleme
Hallo,
folgendes Problem tritt bei mir auf: Ich habe einen Double-Wert den ich je nach Präzision mit dem Faktor 10^präzision multipliziere. Anschliessend möchte ich nur noch den Integeranteil des double wertes.
Delphi-Quellcode:
Angenommen wir haben eine Präzision von 4, dann ist der Wert (den ich im Debugger sehe) bei Double1 = 24353. Der Wert in Double2 ist allerdings 24352. Was mache ich falsch?
Weight := 2.4353000;
Weight := Weight * Power( 10, Präzision); Double1 := Weight ; Double2 := Trunc( Weight ); |
Re: Trunc() probleme
Versuch es mal mit Int() statt Trunc().
|
Re: Trunc() probleme
Hallo,
Bei int bekomme ich einen compiler fehler: incompatible types: integer and extended |
Re: Trunc() probleme
Wie wäre es wenn Du aus Double2 einen Integertypen machst.
Weil trunc liefert einen Integer zurück und ich nehme an, dass Double2 ein Extended Type ist. Grüße Klaus |
Re: Trunc() probleme
dem kann ich zustimmen
aber ich würde vllt. round( ) nehmen, da trunc immer abrundet, es sei denn es ist so gewollt und Präzision ohne ä schreiben also mit ae oder so und aufpassen, dass der wert nicht zu hoch wird, mit dem du potenzierst |
Re: Trunc() probleme
Alternativ wäre vielleicht noch Floor und Ceil zu nennen, aus der Unit Math.
|
Re: Trunc() probleme
Hallo,
Ja das abschneiden ohne runden ist gewollt. Aber kann mir einer Erklären warum das nicht funktioniert.
Delphi-Quellcode:
lTemp1 ist 24353procedure TForm1.RzMemo1Click(Sender: TObject); var lTemp3 : Double; lTemp2 : Double; lTemp1 : Double; begin lTemp3 := 2.4353000; lTemp2 := Power(10,4); lTemp1 := lTemp3*lTemp2; lTemp2 := Trunc(lTemp1); RzMemo1.Lines.Add(FloatToStr(lTemp1)); RzMemo1.Lines.Add(FloatToStr(lTemp2)); end; lTemp2 ist 24352 edit: Habe auch das ganze mit int versucht, aber gleiches Resultat
Delphi-Quellcode:
procedure TForm1.RzMemo1Click(Sender: TObject);
var lTemp3 : Double; lTemp2 : Double; lTemp1 : Double; lInt : Int64; begin lTemp3 := 2.4353000; lTemp2 := Power(10,4); lTemp1 := lTemp3*lTemp2; lInt := Trunc(lTemp1); RzMemo1.Lines.Add(FloatToStr(lTemp1)); RzMemo1.Lines.Add(IntToStr(lInt)); end; end. |
Re: Trunc() probleme
Hi
Zitat:
Delphi-Quellcode:
Der Grund ist, das es bei Double oft eine Ungenauigkeit im Bitmuster gibt (niederwertigste Stelle) Ich hab mal noch unter Turbo mir die Zähne dran ausgebissen, eine Abfrage
Double2 := Trunc( Weight+0.00001);
Delphi-Quellcode:
nie das richtige Ergebnis brachte.
If 4/4=Trunc(4/4) then // Zahlen waren natürlich Variablen
Ich kann mich auch irren, aber den Versuch solltest du mal starten. Die Zahl, die du addierst, kann so klein sein, das sie dein Ergebnis nicht verfälscht. Gruß oldmax |
Re: Trunc() probleme
Zitat:
|
Re: Trunc() probleme
Hallo,
Ja wenn ich 0.0000000001 zum Wert addieren dann geht es. Aber ich kann mir das trotzdem nicht erklären, denn ich schneide ja die stellen nach dem komma ab, womit doch die niederwertigsten bits nicht mehr berücksichtigt werden sollten. edit: Irgendwie ist mir diese Lösung nicht so sympatisch. Gibt es vielleicht noch andere Möglichkeiten oder ist dies das normale Vorgehen um dieses Problem zu lösen? |
Re: Trunc() probleme
Guck mal hier:
![]() |
Re: Trunc() probleme
Hallo,
Danke für den Link. Das Vergleichproblem kenne ich. Dafür nutze ich in Delphi sameValue() oder compareValue. |
Re: Trunc() probleme
Hallo,
wenn alles andere nicht hilft: (1) In einen String umwandeln (2) Bis zum Punkt mit pos und copy ectr. den ganzzahligen Anteil entnehmen (3) In Integerwert zurückwandeln Diese Methode habe ich früher zur Bearbeitung z.B. von Noten verwendet wo genaue Werte zwingend waren. Gruss HL |
Re: Trunc() probleme
dann kann man aber auch gleich mit ints bzw. int64 arbeiten.
Beispiel: Wenn ich 0,5 Kilo von irgendwas habe und mir die Ungenauigkeit bei Gleitkommazahlen nicht gefällt ist es einfach mal sinnvoller in Gramm zu rechnen und somit anstelle von Gleitkomma einfach ganzzahlen zu verwenden. |
Re: Trunc() probleme
Hallo
schau dir mal die aktuelle Diskussion zu RoundTo an ... meineserachtesn macht math.RoundTo das was du benötigst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 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