Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Passenden Datentypen gesucht (https://www.delphipraxis.net/174468-passenden-datentypen-gesucht.html)

NoNoPe 24. Apr 2013 08:34

Passenden Datentypen gesucht
 
Hallo,

ich suche gerade einen Datentypen für Zahlen. Er muss aber möglichst viele Ziffern vor dem Komma aufnehmen können, aber nach dem Komma reichen zwei. Welchen würdet ihr mir empfehlen?

Danke schonmal im voraus

Der schöne Günther 24. Apr 2013 08:41

AW: Passenden Datentypen gesucht
 
Code:
 Type Storage size                       Range          
 
 Byte      1                             0 to 255
 ShortInt  1                          -127 to 127
 Word      2                             0 to 65,535
 SmallInt  2                       -32,768 to 32,767
 LongWord  4                             0 to 4,294,967,295
 Cardinal  4*                            0 to 4,294,967,295
 LongInt   4                -2,147,483,648 to 2,147,483,647
 Integer   4*               -2,147,483,648 to 2,147,483,647
 Int64      8    -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
 
 Single    4     7  significant digits, exponent  -38 to +38
 Currency  8    50+ significant digits, fixed 4 decimal places
 Double    8    15  significant digits, exponent -308 to +308
 Extended 10    19  significant digits, exponent -4932 to +4932
 
 * Note : the Integer and Cardinal types are both 4 bytes in size at present (Delphi release 7), but are not guaranteed to be this size in the future. All other type sizes are guaranteed.
Quelle: DelphiBasics.co.uk

Currency?

jfheins 24. Apr 2013 08:42

AW: Passenden Datentypen gesucht
 
Fixed-point.

Also wenn es dir um zwei Nachkommastellen im Dezimalsystem geht, speichert du einfach "hundertstel" ab. Bei der Anzeige fügst du dann das Komma ein. Der Basis-Datentyp kann dann Integer sein oder Int64.

NoNoPe 24. Apr 2013 17:41

AW: Passenden Datentypen gesucht
 
Danke für die Antworten. Ich werde mal sehen, welchen ich benutze. Ich habe garnicht damit gerechnet, dass die ersten Antworten so früh kommen. Danke dafür.:thumb:

mjustin 24. Apr 2013 18:02

AW: Passenden Datentypen gesucht
 
Currency ist naheliegend, hat aber teilweise Schwächen, bedingt durch Bugs im Compiler. Mit manchen Delphi Versionen liefert dieses Programm die Ausgabe "strange":

Delphi-Quellcode:
program Project14358407;

{$APPTYPE CONSOLE}

var
  C: Currency;
begin
  C := 1.32;

  if C <> 1.32 then
  begin
    WriteLn('strange');
  end;

  ReadLn;
end.

Bummi 24. Apr 2013 18:34

AW: Passenden Datentypen gesucht
 
Das ist aber keine Spezialität von Currency.
Ein Vergleich von
Delphi-Quellcode:
   if C <> 1.32 then
wird außer bei Extended und Variant immer anschlagen single,real,double ....

mjustin 24. Apr 2013 18:38

AW: Passenden Datentypen gesucht
 
Zitat:

Zitat von Bummi (Beitrag 1212753)
Das ist aber keine Spezialität von Currency.

Laut Barry Kelly ist Currency "not susceptible to precision issues in the same way that floating point code is." (link), insofern ist Currency schon etwas Besonderes. In den meisten Delphi Version liefert der Vergleich auch wie erwartet False.

Union 25. Apr 2013 00:34

AW: Passenden Datentypen gesucht
 
Deshalb gibt es ja die Funktion Delphi-Referenz durchsuchenCompareValue:
Delphi-Quellcode:
if CompareValue(1.32, C, 0.005) <> EqualsValue then
   Writeln('Arrrr');

Furtbichler 25. Apr 2013 06:58

AW: Passenden Datentypen gesucht
 
Alles Falsch. :-)

Currency heißt nicht umsonst Currency. Das soll *genau* rechnen können. Ich kauf mir doch keinen Ferarri, den ich dann vom Pferd ziehen lasse.. :stupid:

Eigentlich ist Currency ein Int64, allerdings um 4 Dezimalstellen nach links geschoben. Und da die Umsetzung von Int64 im Compiler meines Wissens nach nicht 100% korrekt ist, kann es zu Problemen führen (zumindest früher)

Beweis:
Delphi-Quellcode:
Program CurrencyIsInt64;
Var
  c : Currency;
  i : Int64 absolute c;

begin
  writeln(c);
  writeln(i);
end.
Mit Currency sind also 14 Stellen vor dem Komma (und 4 danach) darstellbar.

Alternativen wären Klassen, wie TBigNum oder BigInt. Beides zu ergoogeln oder zu erdepelen ("in der DP suchen")
TBCD geht auch, ist aber im Wertebereich beschränkt und erst in "neueren" Versionen vorhanden(?)

Nebenbei:
Zitat:

Zitat von Bummi (Beitrag 1212753)
Ein Vergleich von...wird außer bei Extended und Variant immer anschlagen single,real,double ....

Auch falsch. Alles was floating point ist, und dazu gehört auch extended und variant (wenn der einen FP kapselt) sollte *NIE* auf Gleichheit geprüft werden. Es kann funktionieren (und bei Extended ist die Wahrscheinlichkeit größer, das es funktioniert), aber es muss nicht.

Beweis:
Delphi-Quellcode:
Var
  e,e1 : Extended;

begin
  e := 0;
  repeat
    e1 := e;
    e := e+0.1;
  until e-e1<>0.1;
  writeln(FloatToStr(r));
end.
Merke: Floating Point ist schnell, aber nicht genau.

Jonas Shinaniganz 25. Apr 2013 07:37

AW: Passenden Datentypen gesucht
 
Ich vergleiche immer ganz gerne mit einer eigenen Funktion, der ich noch einen Tolleranz-Wert mit übergebe . Grüße
Delphi-Quellcode:
function IsAboutEqual(Zahl1, Zahl2 : Double; Tolleranz : Integer) : Boolean;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 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