# Real Zahl auf Nachkommastelle runden



## digga (8 November 2007)

Hallo zusammen,

da die Suche mich nicht zum richtigen Ergebniss geführt hat frag ich hier mal nach.

Ich habe eine Real Zahl, die ich auf eine Nachkommastelle runden möchte.

Sprich aus 15,639856 --> 15,6 oder aus 15,258 --> 15,3.

Wie ich auf eine Ganzzahl runde ist mir bekannt nur weiss ich nicht wie man da im Nachkommabereich runden muss......

Kann mir da vielleicht jemand helfen?

DAnke

mfg

Digga


----------



## zotos (8 November 2007)

myReal2 := INT_TO_REAL(REAL_TO_INT(myReal * 100)) / 100;

//Edit: ich hatte 2 Nachkommastellen gelesen. Für eine ist es natürlich:
myReal2 := INT_TO_REAL(REAL_TO_INT(myReal * 10)) / 10;


----------



## Ralle (8 November 2007)

Oder in AWL:


```
L #MyReal
      L     10
      *R    
      RND   
      DTR   
      L     10
      /R    
      T #MyReal
```


----------



## Jens944S2 (27 Dezember 2012)

Hallo!

Ist zwar schon alt der Thread, aber ich habe aktuell das Problem.
Ich nutze PC-WORX (Phoenix Contact) und da funktioniert der Code von @zotos nicht. Wenn ich in ST folgendes eingebe:

```
Ergebnis_Real := INT_TO_REAL(REAL_TO_INT(Zahl_Real * 10.0)) / 10.0;
```
gibt es zwischen Ergebnis_Real und Zahl_Real keinen Unterschied.
Hat jemand einen Tip?

Warum gibt es so etwas einfaches wie eine Runden-Funktion in der SPS-Welt nicht? Gibts in jeder ordentlichen Sprache...


----------



## hucki (27 Dezember 2012)

Jens944S2 schrieb:


> ... gibt es zwischen Ergebnis_Real und Zahl_Real keinen Unterschied. ...


Wie sind denn Deine Zahlen Ergebnis_Real und Zahl_Real?
Denn Real_TO_INT beinhaltet (zumindest bei S7) die Rundenfunktion.







Jens944S2 schrieb:


> ... Warum gibt es so etwas einfaches wie eine Runden-Funktion in der SPS-Welt nicht? Gibts in jeder ordentlichen Sprache...


Alle Rechnungen in INT oder DINT werden auf ganze Stellen gerundet.
Sollte doch an Rundenfunktionen reichen.


----------



## Ritschi (13 Oktober 2015)

Hallo,

ich vermute, dass es daran liegt, dass die Phoenix den Code so nicht auflösen kann. Ich habe aktuell auch einen Anwendungsfall und werde es morgen mal ausprobieren und meine Erfahrung dann hier teilen.

MFG

Ritschi


----------



## svenhuber (19 Oktober 2017)

Runden mit Nachkommastellen ist nicht so einfach wie die Funktion Runden() in Excel. Dort ist das Ergebnis eigentlich ein abgeschnittener String (analog zu Number.toFixed() in JavaScript). Wenn man wie im Beispiel aus Beitrag#1 15,6 in Real darstellen will, wird daraus das Hexmuster DW#16#41799999. Nach dem Bestimmen des Bias (Exponent der 2er-Potenz), wird von dessen Vielfachen 1 abgezogen und der Rest auch als 2er-Potenzen abgespeichert also Hälfte, Viertel, Achtel usw. bis 2^-23. Dadurch sind nur Vielfache solcher 2er-Potenzen wirlich genau. Wenn man das Hexmuster aus dem Beispiel wieder in eine Zahl zurückrechnet, kommt da (1+0,9499999284744263)*2^(130-127)=15,59999942779541 raus. Es ist also nahezu unmöglich Realzahlen exakt auf 1 Stelle nach dem Komma zu runden.


----------



## JanB1 (19 Oktober 2017)

svenhuber schrieb:


> Runden mit Nachkommastellen ist nicht so einfach wie die Funktion Runden() in Excel. Dort ist das Ergebnis eigentlich ein abgeschnittener String (analog zu Number.toFixed() in JavaScript).



Ein Abgeschnittener String bei welchem die vorderste abgeschnittene Stelle überprüft wird, ob sie >=5 ist.


----------



## Ritschi (19 Oktober 2017)

Hallo,

wenn ich mir das folgende genau ansehe, denke ich, dass die Syntax nicht ganz stimmt


Ergebnis_Real := INT_TO_REAL(REAL_TO_INT(Zahl_Real * 10.0)) / 10.0



Versuche mal:
Ergebnis_Real := INT_TO_REAL(Real_TO_INT (Zahl_Real +10.0));
Ergebnis_Real := Ergebnis_Real / 10.0;

MfG

Ritschi


----------



## DeltaMikeAir (19 Oktober 2017)

Habt ihr alle mal auf das Datum der Fragestellung geschaut?


----------



## Heinileini (19 Oktober 2017)

DeltaMikeAir schrieb:


> Habt ihr alle mal auf das Datum der Fragestellung geschaut?


Nur noch 20 Tage bis zum 10-jährigen. Sind Feierlichkeiten geplant?
Wer darf die Ehrung entgegennehmen? Der ThemenStarter oder der, der den Ablauf der 10 Jahre mit seiner Antwort am genauesten trifft?
Wer hält eigentlich bisher den Rekord, den unkaputtbarsten Thread losgetreten zu haben?
Gruss, Heinileini


----------



## JanB1 (19 Oktober 2017)

DeltaMikeAir schrieb:


> Habt ihr alle mal auf das Datum der Fragestellung geschaut?



Jap. Ich konnt trotzdem nicht widerstehn.


----------



## barnsi (29 Mai 2020)

Habe es so gelöst, dass auf eine Nachkommastelle "richtig" gerundet wird:

```
L     #IN
L     1.000000e+002
*R    
L     5.000000e+000
+R    
L     1.000000e+001
/R    
RND   
DTR   
L     1.000000e+001
/R    
T     #IN
```


----------



## hucki (29 Mai 2020)

barnsi schrieb:


> ... dass auf eine Nachkommastelle "richtig" gerundet wird...


Für "richtig" müsstest Du bei genau x,x5 noch prüfen, ob zur geraden Zahl bei der 1. Kommastelle auf- oder abgerundet werden muss. Also ob die +5 dann nicht schon wieder zuviel dazu sind.

Bei der S7-1x00 macht ROUND dies mathematisch korrekt.


----------



## barnsi (29 Mai 2020)

..ich addiere die 5 zur zweiten Nachkommestelle, dadurch wird beim Abschneiden die erste Nachkommastelle automatisch richtig, oder?
0.05*100+5 wird zu 0.1
0.04*100+5 bleibt bei 0.0


----------



## hucki (29 Mai 2020)

barnsi schrieb:


> ..ich addiere die 5 zur zweiten Nachkommestelle, dadurch wird beim Abschneiden die erste Nachkommastelle automatisch richtig, oder?
> 0.05*100+5 wird zu 0.1
> 0.04*100+5 bleibt bei 0.0


0,05 gerundet ist 0,0 (abrunden), nicht 0,1. 
0,15 gerundet ist 0,2 (aufrunden).

Wenn die zu rundende Stelle die 5 ist und keine weiteren Stellen folgen, wird in der Mathematik auf die gerade Zahl der Stelle davor gerundet.


PS:
Deine Rundung ist vom Aufwand/Nutzen völlig okay.
Ging nur um die Betonung des "richtig". Dazu fehlen halt noch ein paar Prozent.
:razz:


----------



## LargoD (29 Mai 2020)

hucki schrieb:


> ...Wenn die zu rundende Stelle die 5 ist und keine weiteren Stellen folgen, wird in der Mathematik auf die gerade Zahl der Stelle davor gerundet...


???
 Quelle bitte!
Gruß
Erich


----------



## hucki (30 Mai 2020)

LargoD schrieb:


> ???
> Quelle bitte!


Irgendwann im Mathematikunterricht, vermutlich so 4./5. Klasse (ziemlich lange her bei mir) -> Symmetrisches Runden:


			
				Wikipedia schrieb:
			
		

> *Symmetrisches Runden*
> 
> Die _symmetrische_ (oder _geodätische, __*mathematische*__, unverzerrte, wissenschaftliche_[SUP][3][/SUP]) Rundung ist wie folgt definiert (Formulierung angepasst):[SUP][4][/SUP]
> 
> ...



PS:
Und wie gesagt, ROUND arbeitet auch genau so, auch wenn die TIA-Hilfe da vielleicht etwas ungünstig formuliert ist:


			
				F1 schrieb:
			
		

> *ROUND: Zahl runden*
> 
> Beschreibung
> Mit der Anweisung "Zahl runden" runden Sie den Wert am Eingang IN zur nächsten Ganzzahl. Die Anweisung interpretiert den Wert am Eingang IN als Gleitpunktzahl und wandelt sie in eine Ganzzahl oder eine Gleitpunktzahl um. *Liegt der Eingangswert zwischen einer geraden und einer ungeraden Zahl, wird die gerade Zahl gewählt.*


----------

