Delphi-PRAXiS

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?

Luckie 18. Apr 2008 08:49

Re: Trunc() probleme
 
Guck mal hier: http://www.michael-puff.de/Artikel/2...liesskomma.php

day 18. Apr 2008 08:53

Re: Trunc() probleme
 
Hallo,
Danke für den Link. Das Vergleichproblem kenne ich. Dafür nutze ich in Delphi sameValue() oder compareValue.

HLukas 18. Apr 2008 09:13

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

SirThornberry 18. Apr 2008 09:58

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.

peschai 18. Apr 2008 11:04

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