Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Kommazahlen


MisterX91 - Di 01.06.10 17:12
Titel: Kommazahlen
Hallo, ich habe vor kurzer Zeit angefangen mit Delphi zu programmieren und bin totaler Anfänger.
Ich habe nach einer Methode gesucht, mit der man prüfen kann, ob eine Zahl eine Kommazahl ist, doch wenn ich folgendes eintippe: "if ((c * 2) mod 2) = 0 then...", meldet Delphi: "Operator not applicable to this operand type" und "Comparing signed and unsigned types - widened both operands".
Was mache ich falsch? Ich finde einfach keine Lösung.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Di 01.06.2010 um 23:17


MaPsTaR - Di 01.06.10 18:08

Hallo,

Was sagt dir denn die Fehlermeldung
Zitat:
Operator not applicable to this operand type
?

...
Zitat:
Operator ist auf diesen Operandentyp nicht anwendbar


soweit ich weiß arbeiten mod und div nur mit ganzen Zahlen...

vielleicht gibt es noch ein elegantere Lösung, aber das hier sollte seinen Zweck erfüllen...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var int_dummy: integer;
begin
  if TryStrToInt(Edit1.Text, int_dummy)
  then
    ShowMessage('ganze Zahl')
  else
    ShowMessage('reelle Zahl');


LSanchez - Di 01.06.10 18:37

beide Operanden müssen "Integer" sein. Wenn C "Double" ist, ist C*2 auch "Double"

Gruß

L. Sanchez


jaenicke - Mi 02.06.10 09:06

user profile iconMisterX91 hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe nach einer Methode gesucht, mit der man prüfen kann, ob eine Zahl eine Kommazahl ist
Wenn du schon eine Zahl hast, dann gibt es da keine Möglichkeit mehr. Denn durch die Ungenauigkeit bei der Binärdarstellung einer Dezimalzahl hast du dann auch bei ursprünglich ganzen Zahlen in der Regel Nachkommastellen.

Es gibt zwei Möglichkeiten:
Entweder wie bereits gezeigt wurde bereits bei der Umwandlung aus einem String prüfen.
Oder wenn du nur eine Fließkommazahl hast den Nachkommaanteil prüfen ob der sehr klein ist:

Delphi-Quelltext
1:
2:
if IsZero(Frac(C)) then
  ShowMessage('Ganze Zahl in C');


Gammatester - Mi 02.06.10 11:14

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Denn durch die Ungenauigkeit bei der Binärdarstellung einer Dezimalzahl hast du dann auch bei ursprünglich ganzen Zahlen in der Regel Nachkommastellen.
Das ist nicht ganz richtig: Double-Zahlen stellen ganzzahlige Werte bis +-(2^53-1) exakt dar (also alle integer), Extended entsprechend bis 2^64-1 also alle int64. Ein Problem kännte es demnach allenfalls geben, wenn ein Ganzzahlwert größer als 2^53 (also mehr als 16 Dezimalstellen) in ein Double gepackt werden sollen. Deshalb reicht wohl in den meisten Fällen die Regel:

c ist eine ganze Zahl wenn frac(c)=0 ist.