![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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