Nachkommastellen vergleichen, bei jeder Vorkomma stelle...

Step7Neuling

Level-2
Beiträge
226
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte gerne Eingangswerte vergleichen auf ihre Kommastelle....wobei die Vorkomma Stelle beliebig sein soll...

d.h.


1000.78
1247.78 Soll im gleichen Vergleicher laufen es wird nur auf die .78 geachtet, der Rest wird weitergeleitet...


Wie mache ich das....?

Wenn ich ein LT oder ein LE nehme...wird ja der Komplette Werte genommen...aber ich möchte die Kommastelle vergleichen
unterschiede soll es geben... 1000.78 gegenüber 1000.98 aber nicht bei 1200.78 gegenüber 1478.78

Ich hoffe ich habe dies verständlich erklärt...

*g*
 
Du könntest
A) die Zahlen in String umwandeln, (den Dezimalpunkt suchen), die Nachkomma-Ziffern vergleichen
B) mit TRUNC den Vorkomma-Teil ermitteln, von der Eingangszahl abziehen --> ergibt nur die Nachkommastellen. (diese Variante könnte Rundungsfehler erzeugen)
Code:
nachkommawert := eingangswert - INT_TO_REAL(TRUNC(eingangswert)) ;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also das mit dem String liest nicht schlecht...

Ich habe es jetzt so gemacht..Ich wandel den Wert von REAL zu String und könnte dann mit Left die Zeichen entfernen, die mich stören...jetzt ist das Problem das der String verkehrt ist...kann man den Umkehren?
Also ich müsste ihn umkehren bevor ich die Zeichen abschneide...

Oder wie meinst du das mit dem Dezimalpunkt finden.....??!?!??!
 
alles klar bin grad selbst drauf gekommen..

Wenn es Left gibt , gibt es auch right... *g*


manchmal...sieht man den Wald einfach nicht..

Ich danke dir...
 
Was mir auch auf die schnelle so einfallen würde (ohne es proboert zu haben),

Die Real in Integer wandeln und den erhaltenen Wert von der Real wieder abziehen.
Dann sollte nur die Kommastellen über bleiben.
Dann halt den zweiten Wert vergleichen >,< oder = usw ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Real in Integer wandeln und den erhaltenen Wert von der Real wieder abziehen.
Dann sollte nur die Kommastellen über bleiben.
Dann halt den zweiten Wert vergleichen >,< oder = usw ...

Hier sollte dann denke ich der Integer Wert auf- oder abgerundet werden, dadurch bekommst du auch Rundungsfehler.
Die beste Variante ist diese mit der Umwandlung in STRING und dem Entfernen der Vorkommastellen.

Grüße,
Flo
 
Hallo,
hier bitte erstmal überprüfen, wie die in String gewandelte Dezimalzahl aussieht. Bei Siemens würde aus 1234.56 im String "1.23456E003" werden. Das ist hier vielleicht auch so.

Hast du immer die gleiche Anzahl von Nachkommastellen ? Wie groß werden deine Zahlen max. ?
Vielleicht wäre es auch sinnig die Zahl * 100 (oder * 1000) in einem DINT zu wandeln und dann mit einem MOD 100 oder MOD 1000) zu arbeiten.

Gruß
Larry
 
Ich glaube bei der Lösung mit TRUNC wird nicht gerundet. TRUNC schneidet ja nur den Teil hinter dem Komma (Punkt) ab. TRUNC(1.6) und TRUNC(1.4) gibt beides mal 1. Und bei der nachfolgenden Subtraktion sollte eigentlich auch nicht gerundet werden. Ich würde diese Lösung auf jedem Fall einem gebastel mit String-Funktionen vorziehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diese Formel liefert rundungsfrei die ersten beiden Nachkommastellen (1234.56 ergibt 56):
Code:
nachkommawert := TRUNC(eingangswert * 100.0) MOD 100 ;

EDIT: hat Larry ja auch schon geschrieben

Harald
 
Ich glaube bei der Lösung mit TRUNC wird nicht gerundet. TRUNC schneidet ja nur den Teil hinter dem Komma (Punkt) ab. TRUNC(1.6) und TRUNC(1.4) gibt beides mal 1.
Richtig, bei TRUNC wird nie gerundet. Es kann höchstens passieren, daß die Ganzzahl nicht in einen DINT passt.

Und bei der nachfolgenden Subtraktion sollte eigentlich auch nicht gerundet werden.
Dies ist ein Irrtum. Hier wird gerundet!
Das Ergebnis einer REAL-Berechnung ist in den meisten Fällen eine "Rundung" auf den nächsten als REAL-Zahl darstellbaren Wert, weil nicht alle Zahlen als REAL-Zahl darstellbar sind.

Ich würde diese Lösung auf jedem Fall einem gebastel mit String-Funktionen vorziehen.
Es lohnt sich, mal drüber nachzudenken. Das "Gebastel" kommt auf ein korrektes Ergebnis, die TRUNC-Lösung leider nicht immer.


Willkürlich herausgegriffen:

Laut Aufgabenstellung soll ein Vergleich der Nachkommastellen dieses Beispiels TRUE ergeben:
Eingangswert_1 := 1234.56
Eingangswert_2 := 1000.56

Die TRUNC-Variante
Code:
nachkommawert := eingangswert - INT_TO_REAL(TRUNC(eingangswert)) ;
ergibt
nachkommawert(1234.56) = 0.5600586
nachkommawert(1000.56) = 0.5599976
Der Vergleich nachkommawert(Eingangswert_1) = nachkommawert(Eingangswert_2) --> ergibt FALSE !


Diese Formel
Code:
nachkommawert := TRUNC(eingangswert * 100.0) MOD 100 ;
ergibt für beide Eingangswerte nachkommawert = 56
Der Vergleich nachkommawert(Eingangswert_1) = nachkommawert(Eingangswert_2) --> ergibt TRUE !


Die Variante mit dem String-Gebastel vermeidet REAL-Berechnungen und kommt deshalb ebenfalls auf das korrekte Ergebnis.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würd - eventuell - das Problem anders angreifen:
Wo kommen die Real-Werte überhaupt her?
Die meisten Signale kommen eigentlich als Int oder als DInt in die Steuerung und werden erst durch irgendwelche Umwandlungen und Skalierungen zu Real.
Also wenn möglich das Signal in der "Rohform" bearbeiten.

Gruß
Dieter
 
Zurück
Oben