Autor Beitrag
MisterX91
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 01.06.10 17:12 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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...
ausblenden 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');

_________________
Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
LSanchez
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26
Erhaltene Danke: 8



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
if IsZero(Frac(C)) then
  ShowMessage('Ganze Zahl in C');
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: 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.