AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Gibt es in Delphi den Datentyp decimal, wie bei c# ?
Thema durchsuchen
Ansicht
Themen-Optionen

Gibt es in Delphi den Datentyp decimal, wie bei c# ?

Ein Thema von kwhk · begonnen am 5. Mai 2019 · letzter Beitrag vom 7. Jan 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von kwhk
kwhk

Registriert seit: 25. Mär 2009
Ort: Dresden
168 Beiträge
 
Delphi 10.3 Rio
 
#1

Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 5. Mai 2019, 18:42
In C# gibt es den Typ decimal, damit kann man eine Zahl in einer 16-Bytes-Variablen darstellen. Dabei sind die ersten 14 Byte die Mantisse als Integer-Zahl und die höchsten 2 Byte geben die Anzahl Kommastellen an, wobei das höchste Bit das Vorzeichen der decimal-Zahl darstellt.
Man kann also ziemlich große Zahlen darstellen, damit rechnen, in Strings wandeln u.a.m.
Bei Delphi habe ich nur int64 (8 Bytes) als grösste mögliche int-Zahl gefunden.

Delphi max-hex = 7F FF FF FF FF FF FF FF ( int 64 Bits)
C# max-hex = 7F FF FF FF FF FF FF FF FF FF FF FF FF FF ( int 112 bits )

Gibt es inzwischen auch die Möglichkeit einer int-Zahl mit 112 Bits ?

https://docs.microsoft.com/de-de/dot...ywords/decimal
Hartmut
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 5. Mai 2019, 18:59
Hallo Hartmut,

versuch es mal mit der Multipräzisions-Arithmetik-Bibliothek MPArith 1.39.12 von Wolfgang Ehrhardt:

https://sslsites.de/wolfgang-ehrhardt.de/index_de.html

Es ist allerdings die allerletzte Version von ihm (= Gammatester in unserem Forum), da er Anfang des Jahres leider verstorben ist.

Ich benutze seine Routinen seit langem mit großem Erfolg, die eine nahezu beliebige Anzahl an Nachkommastellen (bis in die Millionen) ermöglichen.

Gruß

Andreas

Geändert von Andreas13 ( 5. Mai 2019 um 19:01 Uhr)
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 5. Mai 2019, 23:00
In C# gibt es den Typ decimal, damit kann man eine Zahl in einer 16-Bytes-Variablen darstellen. Dabei sind die ersten 14 Byte die Mantisse als Integer-Zahl

https://docs.microsoft.com/de-de/dot...ywords/decimal
Nein, gibt es nicht. Aber ich habe eine geschrieben, die komplett kompatibel ist mit C#'s decimal (und etwas schneller). Wurde ausführlich getestet.

Kann man auf meiner Seite finden.

Momentan nur eine 32-bit version (mit viel assembler, daher schnell), aber die 64 bit-Version wird in einigen Tagen online gestellt. Und ich arbeite an einer PURE-PASCAL-Version (also ohne Assembler) für andere Plattformen als Windows.

Übrigens, nur 96 bit eines C#-Decimal (12 byte) sind "Mantisse". Das zeigt die Spezifikation von C# auch: 96 bit Mantisse (3 x 32 bit), 5 bit Exponent (Scale, negativ) und 1 bit Zeichen (Sign):

Zitat:
The binary representation of a Decimal number consists of a 1-bit sign, a 96-bit integer number, and a scaling factor used to divide the integer number and specify what portion of it is a decimal fraction. The scaling factor is implicitly the number 10 raised to an exponent ranging from 0 to 28.
Übrigens, es gibt auch noch ein BigInteger und ein BigDecimal.
Rudy Velthuis

Geändert von Rudy Velthuis ( 5. Mai 2019 um 23:21 Uhr)
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 5. Mai 2019, 23:11
Hallo Hartmut,

versuch es mal mit der Multipräzisions-Arithmetik-Bibliothek MPArith 1.39.12 von Wolfgang Ehrhardt:

https://sslsites.de/wolfgang-ehrhardt.de/index_de.html
MPArith war einer der Gründe, dass ich meine eigene BigInteger und BigDecimal geschrieben habe.

Zitat:
Es ist allerdings die allerletzte Version von ihm (= Gammatester in unserem Forum), da er Anfang des Jahres leider verstorben ist.
Probiere doch mal meine Implementationen. Können wie einfache Integer benutzt werden (Operator overloading), es gibt allerdings auch viele Methoden. Ist hochoptimiert.
Rudy Velthuis

Geändert von Rudy Velthuis ( 5. Mai 2019 um 23:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von kwhk
kwhk

Registriert seit: 25. Mär 2009
Ort: Dresden
168 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 6. Mai 2019, 10:06
Danke für die vielen Antworten. Ich habe mit einem kleinen C#-Testprogramm versucht festzustellen, wie die Struktur der decimal-Variablen ist.
Hier der Code und das Ergebnis in einer Testdatei
Code:
  FileStream fileStr = new FileStream(@"Y:\HkTestDECIMAL.xyz",FileMode.Create);
  BinaryWriter binWriter = new BinaryWriter(fileStr);

  decimal d1 = 123.4567890123m;
  decimal d2 = -1000000000.00m;
  decimal d3 = 1m / 3m;
  double r3 = 123.4567890123;

  binWriter.Write(d1);
  binWriter.Write(d2);
  binWriter.Write(d3);
  binWriter.Write(r3);

  binWriter.Close();



0000: CB 04 FB 71  1F 01 00 00  00 00 00 00  00 00 0A 00  decimal d1 = 123.4567890123m;
      -------------------------------------  ===== ~~~~~
      |                                            | 
      |                                            +-------- 10 Kommastellen / Vorzeichen + ( 0 000A )
      +----------------------------------------------------- Hex 011F71FB04CB = Dez 1234567890123

0010: 00 E8 76 48  17 00 00 00  00 00 00 00  00 00 02 80  decimal d2 = -1000000000.00m;
      -------------------------------------  ===== ~~~~~
      |                                            | 
      |                                            +-------- 2 Kommastellen / Vorzeichen - ( 1 0002)
      +----------------------------------------------------- Hex 174876E800 = Dez 100000000000

0020: 55 55 55 05  CB 00 B7 14  CA 44 C5 0A  00 00 1C 00  decimal d3 = 1m / 3m;
      -------------------------------------  ===== ~~~~~
      |                                            | 
      |                                            +-------- 28 Kommastellen / Vorzeichen + ( 0 001C)
      +----------------------------------------------------- Hex 0AC544CA14B700CB05555555 = Dez 33333...(28 x 3)

0030: 0B 40 FB 07  3C DD 5E 40                            double r3 = 123.4567890123;
Bei der Variablen d3 = 1/3, also ein Endlosbruch 0,333..., wird in den ersten 12 Bytes die Mantisse und in den letzten 2 Byte werden Anzahl Kommastellen und Vorzeichen gespeichert. Die Bytes 13 und 14 sind immer 00 00. Deren Bedeutung hab ich nicht nicht erkannt, evtl. nur Füllbytes, damit die decimal-Variable insgesamt 16 Bytes groß ist.

Rudy, Deine Version habe ich mir heruntergeladen und werde sie mal probieren. Danke für den Link.
Hartmut

Geändert von kwhk ( 6. Mai 2019 um 10:19 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 6. Mai 2019, 14:16
@Rudy Velthuis

Hallo Rudy,

Deine Routinen in DecimalsDevelop.dpr (Stand: 16.06.2010), enthalten im aktuellen decimals.zip lassen sich mit meinem Delphi XE5 Professional NICHT (mehr) kompilieren... Hast Du evt. eine aktualisierte Version?

Danke + Gruß

Andreas
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 7. Mai 2019, 19:40
@Rudy Velthuis

Hallo Rudy,

Deine Routinen in DecimalsDevelop.dpr (Stand: 16.06.2010), enthalten im aktuellen decimals.zip lassen sich mit meinem Delphi XE5 Professional NICHT (mehr) kompilieren... Hast Du evt. eine aktualisierte Version?

Danke + Gruß

Andreas
Habe ich gleich ausprobiert. Die unit Console ist nicht notwendig (nur für farbige Ausgabe) und das Problem mit TFormatSettings.

Werde heute Abend noch eine verbesserte Version hochladen.
Rudy Velthuis

Geändert von Rudy Velthuis ( 7. Mai 2019 um 19:50 Uhr)
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 7. Mai 2019, 21:19
Werde heute Abend noch eine verbesserte Version hochladen.
Das ist jetzt geschehen. Sollte ab XE2 (also auch in XE5) compilieren.
Rudy Velthuis
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#9

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 7. Mai 2019, 23:23
@Rudy Velthuis

Danke Rudy für Deine prompte Hilfe!

Gruß
Andreas
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.942 Beiträge
 
Delphi 12 Athens
 
#10

AW: Gibt es in Delphi den Datentyp decimal, wie bei c# ?

  Alt 8. Mai 2019, 21:59
Hallo Hartmut,

versuch es mal mit der Multipräzisions-Arithmetik-Bibliothek MPArith 1.39.12 von Wolfgang Ehrhardt:

https://sslsites.de/wolfgang-ehrhardt.de/index_de.html

Es ist allerdings die allerletzte Version von ihm (= Gammatester in unserem Forum), da er Anfang des Jahres leider verstorben ist.

Ich benutze seine Routinen seit langem mit großem Erfolg, die eine nahezu beliebige Anzahl an Nachkommastellen (bis in die Millionen) ermöglichen.

Gruß

Andreas
Muss man das dann evtl. irgendwo hin retten (Torry, Jedi...), oder wer finanziert den über den Link angegebenen Webspace?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr.
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