TIA Variable Runden aber nicht "kaufmännisch"

ThoPla

Level-2
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
Ich stehe gerade ein wenig auf dem Schlauch:
Ich möchte eine Real Variable Runden, allerdings soll nicht das klassische kaufmännische Runden erfolgen, sondern es soll bereits ab ,2 aufgerundet werden.
Beispiel:
5,1 soll noch abgerundet werden => Ergebnis 5,0
5,2 soll bereits aufgerundet werden => Ergebnis 6,0

Hat jemand eine Idee, oder gibt es gar fertige Funktionen für sowas und ich bin zu blind?

Vielen Dank im vorraus.
 
Du könntest vor dem Runden ca. 0.3 addieren.
Wie soll sich das Runden bei geraden Vorkomma-Werten wie z.B. 4.2 verhalten?

PS: Warum/wofür willst du runden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ob der Vorkomma-Wert gerade oder ungerade ist, spielt dabei keine Rolle.
Es soll grundsätzlich ab .2 aufgerundet werden.

Edit:
Ich will für eine Chargierung runden. Material wird verwogen und aus dem Gesamt-Gewicht geteilt durch die Soll-Menge ergibt sich eine Chargenzahl. Die Soll-Menge darf aber nicht zu weit überschritten werden, so dass früher abgerundet werden soll (lieber eine Charge mehr als weniger)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super vielen Dank.
Es funktionieren ja beide Varianten. (0.2 addieren und normal runden und 0.8 addieren und nur den Ganzzahl-Anteil nehmen).
Ich schau mal, welche Variante ich am besten in die bestehende Formel einbauen kann.
Nochmal vielen Dank für die schnelle Hilfe.
 
Annahme Du willst folgendes:
x = 5.1 --> y = 5
x = 5.11 --> y = 6
x = -5.1 --> y = -5
x = -5.11 --> y = -6

Code:
IF #x >= 0.0 THEN
    #y := DINT_TO_REAL(FLOOR(#x));
    #d := #x - #y;
    IF #d >= 0.1 THEN
        #y := DINT_TO_REAL(CEIL(#x));
    END_IF;
ELSE
    #y := DINT_TO_REAL(CEIL(#x));
    #d := #x - #y;
    IF #d <= -0.1 THEN
        #y := DINT_TO_REAL(FLOOR(#x));
    END_IF;
END_IF;

Kannst Du mal verraten, wofür man die Funktion braucht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wäre dann etwas Haarspalterei oder?

Wikipedia:
Die symmetrische (oder geodätische, mathematische, unverzerrte, wissenschaftliche[3]) Rundung ist wie folgt definiert (Formulierung angepasst):[4]


  1. Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 0, 1, 2, 3 oder 4, so wird abgerundet.
  2. Ist die Ziffer an der ersten wegfallenden Dezimalstelle eine 5 (gefolgt von weiteren Ziffern, die nicht alle null sind), 6, 7, 8 oder eine 9, so wird aufgerundet.
  3. Ist die Ziffer an der ersten wegfallenden Dezimalstelle lediglich eine 5 (oder eine 5, auf die nur Nullen folgen), so wird derart gerundet, dass die letzte beizubehaltende Ziffer gerade wird („Gerade-Zahl-Regel“).

Diese Art der Rundung wird in numerischer Mathematik, Ingenieurwissenschaft und Technik verwendet. Sie ist im IEEE-754-Standard für das Rechnen mit binären Gleitkommazahlen in Computern vorgesehen. In englischsprachiger Literatur heißt sie Round to Even oder Banker’s Rounding.[5]

Beispiele (Rundung auf eine Nachkommastelle):


  • 2,2499 ≈ 2,2 (nach Regel 1)
  • 2,2501 ≈ 2,3 (nach Regel 2)
  • 2,2500 ≈ 2,2 (nach Regel 3 zur geraden Ziffer hin gerundet)
  • 2,3500 ≈ 2,4 (nach Regel 3 zur geraden Ziffer hin gerundet)
 
Annahme Du willst folgendes:
x = 5.1 --> y = 5
x = 5.11 --> y = 6
x = -5.1 --> y = -5
x = -5.11 --> y = -6

Code:
IF #x >= 0.0 THEN
    #y := DINT_TO_REAL(FLOOR(#x));
    #d := #x - #y;
    IF #d >= 0.1 THEN
        #y := DINT_TO_REAL(CEIL(#x));
    END_IF;
ELSE
    #y := DINT_TO_REAL(CEIL(#x));
    #d := #x - #y;
    IF #d <= -0.1 THEN
        #y := DINT_TO_REAL(FLOOR(#x));
    END_IF;
END_IF;

Kannst Du mal verraten, wofür man die Funktion braucht?
Ich will für eine Chargierung runden. Material wird verwogen und aus dem Gesamt-Gewicht geteilt durch die Soll-Menge ergibt sich eine Chargenzahl. Die Soll-Menge darf aber nicht zu weit überschritten werden, so dass früher abgerundet werden soll (lieber eine Charge mehr als weniger)
Bist du sicher? Wie rundest du? Ich glaube, die vorhandenen Rundungsfunktionen runden mit Geradzahl-Regel.
Ich würde über Ganzzahl gehen.

PS: kann der Wert auch negativ sein?
Der Wert ist immer positiv. Aktuell berechne ich das mit der Calculate Funktion mit folgender Anweisung:
1705495577058.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich das mit der "Gerade-Zahl-Regel" richtig verstehe, ist das in meinem Fall doch egal,
Nein!
Mit Gerade-Zahl-Regel:
- Runden(4.2 + 0.3) ergibt dann 4.0
- Runden(5.2 + 0.3) ergibt 6.0

Ist deine ominöse "Chargenzahl" nicht sowieso eine ganze Zahl? Dann wäre der Weg Ganzzahl(x + 0.8) ideal, weil das immer aufrundet.
 
Nein!
Mit Gerade-Zahl-Regel:
- Runden(4.2 + 0.3) ergibt dann 4.0
- Runden(5.2 + 0.3) ergibt 6.0

Ist deine ominöse "Chargenzahl" nicht sowieso eine ganze Zahl? Dann wäre der Weg Ganzzahl(x + 0.8) ideal, weil das immer aufrundet.
Vielen Dank, das war mir nicht bewusst. Ich habe das gerade mal simuliert und die S7 rundet tatsächlich bei 4.5 auf 4.0.
Man lernt niemals aus...
Also werde ich dann besser 0.8 addieren und dann nur die Ganzzahl verwenden.

Meine Ominöse "Chargenzahl" wird doch erst durch das Runden zu einer Ganzzahl.
Will ich bspw. 481kg auf gleichmäßige Chargen à ca. 150kg verteilen, ergibt das:
481kg / 150kg = 3.206 Chargen => gerundet 3.0 Chargen
Ab 3.2 Chargen soll aber bereits auf 4.0 aufgerundet werden.

Ich hätte nicht gedacht, dass das so ausufern würde
 
Zurück
Oben