Code: Alles auswählen.
REPORT ztest3.
DATA: w1(4) TYPE p DECIMALS 2,
w2(4) TYPE p DECIMALS 2,
result(4) TYPE p DECIMALS 2.
START-OF-SELECTION.
w1 = '4'.
w2 = '219'.
result = nmin( val1 = 100 * w1 / w2 val2 = 100 ).
WRITE result.Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 2):
rob_abc • DeathAndPain
Ohne es probiert zu haben, würde ich sagen, das hängt damit zusammen, dass P für sich betrachtet kein vollständiger Typ ist. Du kannst ja auch kein Feld einfach nur mitRadinator hat geschrieben:Nächster Versuch mit CONV p( ) resultierte in einer Compilermeldung Ein Wert des generischen Typs "P" kann nicht konstruiert werden.
Code: Alles auswählen.
DATA feldname TYPE p.Code: Alles auswählen.
TYPES: vier_dec_2(4) type p decimals 2.
...
result = nmin( val1 = conv vier_dec_2( 100 * w1 / w2 ) val2 = conv vier_dec_2( 100 ) ).Code: Alles auswählen.
DATA result TYPE F.
result = nmin( val1 = 100 * 4 / 219 val2 = 100 ).
WRITE result. "1,8264840182648401E+00Code: Alles auswählen.
DATA result TYPE p length 4 DECIMALS 2.
result = nmin( val1 = 100 * 4 / 219 val2 = 100 ).
WRITE result. "0.00ChatGPT hat geschrieben:Warum steht „0.00“ im Ergebnis?
Weil der Ausdruck nicht in Fließkommaarithmetik, sondern in Dezimalarithmetik erfolgt, sobald das Ziel ein PACKED-Feld ist.
Viele erwarten, dass 100 * 4 / 219 erst in Float berechnet wird → aber das ist falsch.
ABAP konvertiert die Operanden schrittweise in PACKED.
Dabei kann ein Zwischenschritt 0 ergeben (wegen zu kleiner Genauigkeit).
Beispielhafte interne Schritte:
100 * 4 → PACKED → 400
400 / 219 → PACKED Division
PACKED-Zahlen haben begrenzte interne Stellenanzahl → Ergebnis wird zu
1.00… mit abgeschnittenen Nachkommastellen, oder sogar 0, abhängig von der Version & Optimizer.
Am Ende bekommt nmin möglicherweise:
val1 = 0
val2 = 100
Und nmin( 0 , 100 ) = 0.
ChatGPT hat geschrieben:Merksatz
In ABAP richtet sich die Arithmetik nicht nach dem Ausdruck, sondern nach dem Datentyp der Operanden (und oft auch des Zieltyps).
PACKED führt streng dezimale Arithmetik aus und kann sehr leicht Zwischenwerte abschneiden oder auf 0 runden.
Code: Alles auswählen.
REPORT.
DATA ergebnis TYPE p LENGTH 4 DECIMALS 2.
DATA: teiler TYPE i.
DO 219 TIMES.
teiler = 220 - sy-index.
ergebnis = nmin( val1 = 100 * 4 / teiler val2 = 100 ).
WRITE:/ teiler, ergebnis.
ENDDO.Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
a-dead-trousers
Code: Alles auswählen.
REPORT.
DATA ergebnis1 TYPE f.
DATA ergebnis2 TYPE p LENGTH 4 DECIMALS 2.
DATA: teiler TYPE i.
DO 219 TIMES.
teiler = 220 - sy-index.
ergebnis1 = nmin( val1 = 100 * 4 / teiler val2 = 100 ).
ergebnis2 = nmin( val1 = 100 * 4 / teiler val2 = 100 ).
WRITE:/ teiler, ergebnis1, ergebnis2.
ENDDO.Wie wenig Stellen sollen das bitte sein, dass das bei meiner Berechnung schon gesprengt wird?!? Ich finde die Frage viel spannender, wie viele DECIMALS er bei seiner internen Berechnung verwendet. Bisher macht es ja den Anschein, als ob er mit DECIMALS 0 rechnet. Dann wären wir mathematisch aber bei Integerzahlen (und die interne Länge kann so lang sein, wie sie will). Ein absolut bescheuertes Verhalten von ABAP, IMHO.adt hat geschrieben:PACKED-Zahlen haben begrenzte interne Stellenanzahl