Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Trunc() probleme (https://www.delphipraxis.net/112286-trunc-probleme.html)

day 18. Apr 2008 07:14


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:
Weight := 2.4353000;
Weight := Weight * Power( 10, Präzision);

Double1 := Weight ;
Double2 := Trunc( Weight );
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?

DeddyH 18. Apr 2008 07:20

Re: Trunc() probleme
 
Versuch es mal mit Int() statt Trunc().

day 18. Apr 2008 07:48

Re: Trunc() probleme
 
Hallo,
Bei int bekomme ich einen compiler fehler: incompatible types: integer and extended

Klaus01 18. Apr 2008 08:13

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

blink182 18. Apr 2008 08:16

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

Nuclear-Ping 18. Apr 2008 08:24

Re: Trunc() probleme
 
Alternativ wäre vielleicht noch Floor und Ceil zu nennen, aus der Unit Math.

day 18. Apr 2008 08:27

Re: Trunc() probleme
 
Hallo,
Ja das abschneiden ohne runden ist gewollt. Aber kann mir einer Erklären warum das nicht funktioniert.


Delphi-Quellcode:

procedure 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;
lTemp1 ist 24353
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.

oldmax 18. Apr 2008 08:38

Re: Trunc() probleme
 
Hi

Zitat:

Delphi-Quellcode:
Weight := 2.4353000;
Weight := Weight * Power( 10, Präzision);

Double1 := Weight ;
Double2 := Trunc( Weight );

Versuchmal folgendes :

Delphi-Quellcode:
Double2 := Trunc( Weight+0.00001);
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
Delphi-Quellcode:
If 4/4=Trunc(4/4) then // Zahlen waren natürlich Variablen
nie das richtige Ergebnis brachte.
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

DeddyH 18. Apr 2008 08:41

Re: Trunc() probleme
 
Zitat:

Zitat von day
lTemp2 ist 24352

Bei einem kleinen Test kam bei mir heraus: lTemp2 ist 24352,9. Also solltest Du mal den Vorschlag von oldmax ausprobieren.

day 18. Apr 2008 08:45

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 11:46 Uhr.
Seite 1 von 2  1 2      

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