SA0057: Möglicher Verlust von Nachkommastellen

Funktion

Ermittelt Anweisungen mit möglichem Verlust von Dezimalstellen.

Begründung

Ein Codestück der folgenden Art:

nDINT := 1;
fREAL := TO_REAL(nDINT / DINT#2);

kann zu einer Fehlinterpretation führen. Diese Codezeile kann zu der Annahme führen, die Division würde als REAL-Operation durchgeführt und das Ergebnis würde in diesem Fall REAL#0.5 sein. Dies ist jedoch nicht der Fall, die Operation wird als Integer-Operation durchgeführt, das Ergebnis wird auf REAL gecastet und fREAL erhält den Wert REAL#0. Um dies zu vermeiden, sollten Sie durch einen Cast dafür sorgen, dass die Operation als REAL-Operation durchgeführt wird:

fREAL := TO_REAL(nDINT) / REAL#2;

Wichtigkeit

Mittel

Beispiele:

PROGRAM MAIN
VAR
    fREAL : REAL;
    nDINT : DINT;
    nLINT : LINT;
END_VAR
nDINT := nDINT + DINT#11;
fREAL := DINT_TO_REAL(nDINT / DINT#3);              // => SA0057
fREAL := DINT_TO_REAL(nDINT) / 3.0;                 // no error
fREAL := DINT_TO_REAL(nDINT) / REAL#3.0;            // no error
 
nLINT := nLINT + LINT#13;
fREAL := LINT_TO_REAL(nLINT / LINT#7);              // => SA0057
fREAL := LINT_TO_REAL(nLINT) / 7.0;                 // no error
fREAL := LINT_TO_REAL(nLINT) / REAL#7.0;            // no error