BPM erst runden, dann ganzzahlig ausgeben


#1

Hallo,

ich möchte gerne die BPM einheitlich als ganzzahligen Wert, also ohne Nachkomma formatieren - die vorhandenen Nachkomma sollten noch entsprechend gerundet werden. Siehe Beispiel:

vorher:
145.1
55
132.49
79.5
112.00

nachher:
145
55
132
80
112

Ich habe schon einige Posts gelesen, die jeweils einen Teil des Problemes lösen, aber ich kriege es nicht gebacken, alles zusammen zu bringen. Vor allem die Rundung bereitet mir Probleme :slight_smile:

Danke Euch schon mal für die Hilfe.

Thomas


BPM Konverter
Decimal points - can you control them
#2

Vollautomatisches Auf-, Abrunden in 3 Aktionen:

  1. Regulärer Ausdruck:

.[0-4][0-9]$

Treffer ersetzen durch:

nichts

  1. Regulärer Ausdruck

^([0-9][0-9]).[5-9][0-9]$

Treffer ersetzen durch:

$add($1,1)

  1. Regulärer Ausdruck

^([0-9][0-9][0-9]).[5-9][0-9]$

Treffer ersetzen durch:

$add($1,1)

Einfach mal testen, Garantie geb ich heute keine !

Gruss Dickie


#3

Hallo Dickie,

danke für Deine Antwort. Zum Abrunden bin ich auch schon mit

$div(%BPM%,1)

gelangt. Aber warum sich mit weniger zufrieden geben :slight_smile: Vielleicht findet ja doch noch jemand eine Lösung für das Runden - ich probiere auch fleissig weiter.

Thomas


#4

Vollautomatisches Auf-, Abrunden in 3 Aktionen:

  1. Regulärer Ausdruck:

.[0-4][0-9]$

Treffer ersetzen durch:

nichts

  1. Regulärer Ausdruck

^([0-9][0-9]).[5-9][0-9]$

Treffer ersetzen durch:

$add($1,1)

  1. Regulärer Ausdruck

^([0-9][0-9][0-9]).[5-9][0-9]$

Treffer ersetzen durch:

$add($1,1)

Einfach mal testen, Garantie geb ich heute keine !

Gruss Dickie


#5

Da hättest du im Forum bestimmt eine brauchbare Lösung finden können.
Ich benutze die folgende Aktionengruppe, um Mixmeister BPM Werte zu speichern und gerundete BPM Werte anzuzeigen.

Anfang Aktionsgruppe Round BPM to integer

Aktion #1
Aktionstyp 5: Tagfeld formatieren
Feld: BPM_MIXMEISTER
Formatstring: $if2(%BPM_MIXMEISTER%,%BPM%)

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld: BPM
Formatstring: $left($replace(%BPM%,'.',)'00',$add($len($div(%BPM%,1)),2))

Aktion #3
Aktionstyp 5: Tagfeld formatieren
Feld: BPM
Formatstring: $ifgreater($mod(%BPM%,100),49,$add($div(%BPM%,100),1),$div(%BPM%,100))

Ende Aktionsgruppe Round BPM to integer (3 Aktionen)

DD.20080114.1843.CET
Edit. Irrtümliche 44 ausgetauscht mit 49.
DD.20120717.1537.CEST


#6

Hallo Dickie,

Deine Lösung ist schon mal ein Teilerfolg. Nur die BPM mit einer Nachkommastelle bleiben unverändert, z.B. 148.2 bleibt 148.2 - alle anderen ändert er wie erwünscht.

Danke schon mal - ich versuche noch zu verstehen was Du da gemacht hast :slight_smile:.


#7
  1. Regulärer Ausdruck:

.[0-4]$

Treffer ersetzen durch:

nichts

hinzufügen und testen !


#8

Hallo Dickie,

hinzugefügt, getestet, funktioniert! Klasse... danke für Deine Hilfe.

Jetzt habe ich gleich zwei Lösungen für mein Problem - jetzt das Ganze noch verstehen, dann wär's perfekt. Ich versuch mich nochmal reinzudenken :slight_smile:.

Thomas

Hallo DetlevD,

danke für Deine Hilfe. Ich habe im Forum nach bpm* gesucht und u.a. auch einige Aktionen von Dir gefunden - darüber hinaus habe ich die 40 letzten Seiten im Forum DE/Support durchstöbert - leider ohne Erfolg.

Egal, Deine Lösung funktioniert jedenfalls prächtig. Ich habe allerdings die Aktion 1 weggelassen - nach Lesen der Funktionsbeschreibung von "$if2(x,y)" habe ich für meine Daten keinen Sinn darin gesehen (vielleicht hast Du noch eine kurze Erklärung dazu).

Allerbesten Dank für Deine Hilfe.

Thomas


#9

Den BPM Wert lasse ich zunächst mit dem Programm Mixmeister ermitteln.
Mixmeister speichert den BPM Wert mit zwei Dezimalstellen im Tagfeld BPM.
Um diesen präzisen BPM Wert beim anschließenden Runden nicht zu verlieren, speichere ich den Wert in dem Tagfeld BPM_MIXMEISTER für spätere Verwendung, aber nur dann, wenn das Tagfeld BPM_MIXMEISTER leer ist.

DD.20080114.1919.CET


#10

Super vielen Dank fuer die Hilfe DD! Eine Kleinigkeit, die ich persoenlich bevorzuge:
die 44 durch 49 ersetzen, damit 100.45-100.49 zu 100 wird und nicht zu 101 :

$ifgreater($mod(%BPM%,100),49,$add($div(%BPM%,100),1),$div(%BPM%,100))

Vielen Dank noch einmal,
Bjoern


#11

Ich bin der Meinung, dass es nur mit dem Vergleich 'größer als 0.44' bzw. 'kleiner als oder gleich 0.44' eine korrekte Rundung ergibt, denn 100.45 muss gerundet 101 ergeben (schrittweises Aufrunden 100.45 ==> 100.5 ==> 101) und 100.44 muss 100 ergeben, oder etwa nicht?

DD.20080114.1931.CET


#12

Hallo DD,

mit dem x.44 als Grenze könnte ich leben - verstehe aber nicht, warum 101.44 100 ergeben muss (oder ist's ein Tippfehler?).

Thomas


#13

Es ist ein Tippfehler - schon korrigiert.

DD.20080114.2010.CET


#14

Hallo Dickie,

beim weiteren Testen ist mir jetzt noch aufgefallen, dass ein BPM-Wert mit Format xxx.5 weiterhin nicht verändert wird (z.B. 65.5 -> 65.5).

Thomas


#15

Vollautomatisches Auf-, Abrunden in 4 Aktionen:

  1. Regulärer Ausdruck:

.[0-4]$
Treffer ersetzen durch:
nichts

  1. Regulärer Ausdruck:

.[0-4][0-9]$
Treffer ersetzen durch:
nichts

  1. Regulärer Ausdruck:

^([0-9]{1,3}).[5-9]$
Treffer ersetzen durch:
$add($1,1)

  1. Regulärer Ausdruck:

^([0-9]{1,3}).[5-9][0-9]$
Treffer ersetzen durch:
$add($1,1)

Damit sollte es jetzt funktionieren !

Gruss Dickie


#16

100.45 muss gerundet 101 ergeben (schrittweises Aufrunden 100.45 ==> 100.5 ==> 101)
und 100.44 muss 100 ergeben, oder etwa nicht?

nee doch! 100.499999999999999999999999999 gerundet auf ganze Zahl gibt 100!

"Ist die Ziffer an der ersten wegfallenden Dezimalstelle ... nicht größer als eine 4, wird abgerundet. Anderenfalls wird aufgerundet. Die folgenden Nachkommastellen werden nicht berücksichtigt. Diese Rundungsregel wird durch die Norm DIN 1333 beschrieben."
http://de.wikipedia.org/wiki/Rundung

:book: HDH, andreas


#17

Das zugehörige Wikipedia Beispiel zeigt für die dritte Nachkommastelle:
'aus 13,3750... € wird 13,38 €'.
'5' ist nicht 'nicht größer als eine 4', also wird aufgerundet von '75' auf '80'.
Das ist kaufmännisches Runden und genauso habe ich es implementiert.

Aber:
Es gibt ein Verfahren, ..., die mathematisch unverzerrte Rundung (englisch round to even). Es rundet von der genauen Mitte zwischen zwei Ziffern immer zur nächsten geraden Zahl auf oder ab. Ansonsten entspricht es dem kaufmännischen Verfahren:
Beispiele.
2,15 --> 2,2
2,45 --> 2,4
2,5 --> 2
3,5 --> 4

Ist vielleicht das 'unverzerrte mathematische Runden' besser geeignet zur Rundung von BPM Werten?

DD.20080123.1833.CET


#18

Nochmal:
'Ist die Ziffer an der ersten wegfallenden Dezimalstelle ... nicht größer als eine 4, wird abgerundet. Anderenfalls wird aufgerundet. Die folgenden Nachkommastellen werden nicht berücksichtigt.'

Runden auf ganze Zahl

123.01 ==> 123
123.49 ==> 123
123.50 ==> 124
123.99 ==> 124

Anfang Aktionengruppe BPM.Runden.NK0

Aktion #1
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $replace(%BPM_MIXMEISTER%,'.',)

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $div(%BPM%,10)

Aktion #3
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $ifgreater($mod(%BPM%,10),4,$add($div(%BPM%,10),1),$div(%BPM%,10))

Aktion #4
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $if($eql(%BPM%,'0'),,%BPM%)

Ende Aktionengruppe BPM.Runden.NK0 (4 Aktionen)

Runden auf eine Stelle nach dem Komma

123.01 ==> 123.0
123.44 ==> 123.4
123.45 ==> 123.5
123.99 ==> 124.0

Anfang Aktionengruppe BPM.Runden.NK1

Aktion #1
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $replace(%BPM_MIXMEISTER%,'.',)

Aktion #2
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $ifgreater($mod(%BPM%,10),4,$add($div(%BPM%,10),1),$div(%BPM%,10))

Aktion #3
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $div(%BPM%,10)'.'$mod(%BPM%,10)

Aktion #4
Aktionstyp 5: Tagfeld formatieren
Feld _______: BPM
Formatstring: $if($eql(%BPM%,'0.0'),,%BPM%)

Ende Aktionengruppe BPM.Runden.NK1 (4 Aktionen)

DD.20111129.1348.CET
Edit.20120717.1525.CEST


How to truncate (or ideally round) TBPM value?