Mein Ziel ist es nicht ein LREAL zu haben was zB genau 3 Nachkommastellen hat und dann nichts. Ich zeige das ganze auf einem Beispiel. Wir verschicken drei Zahlen in unsere Cloud.
1. 1.123456789 (REAL)
2. 2.345000000 (LREAL)
3. 2.344999999 (LREAL);
1. --> in der Cloud bekommen wir genau diese Zahl mit alle Nachkommastellen also 1.123456789. Das will der Kunde nicht sehen. Der will bestimmtes Anzahl an Nachkommastellen sichtbar haben
2. --> in der Cloud wird 2.345 angezeigt, da die LREAL automatisch die restliche Nullen abschneidet (beim REAL passiert das nicht)
3. --> die Cloud zeigt 2.344999999 an.
Deswegen ist es wichtig, dass diese Zahlen mit bestimmte Anzahl an Nachkommastellen verschickt werden..
Nochmal: man kann einen LREAL-Wert nicht mit einer bestimmten Anzahl Nachkommastellen verschicken. Man kann nur die Ausgabe als Text (String, Zeichenfolge) so formatieren, daß (nur) eine bestimmte Anzahl Nachkommastellen angezeigt wird.
Man kann LREAL-Werte runden auf eine bestimmte Anzahl Nachkommastellen, doch das gerundete Ergebnis enthält in den meisten Fällen wieder eine Zahl die mehr als die gewünschte Anzahl Nachkommastellen enthält. Ganz einfach deshalb, weil in LREAL nicht jeder beliebige Wert darstellbar ist und immer auf den nächstliegenden darstellbaren Wert gerundet wird.
Zu Deinem Beispiel:
Wenn Du 2.344999999 durch Deinen oder meinen Rundungscode schickst, dann ist das Ergebnis (wahrscheinlich) 2.3449999999999997513100424 - das Runden hat also nichts gebracht:
Code:
lrTEST := 2.344999999;
diTest :=LREAL_TO_DINT(lrTEST * 1000.0); ---> ergibt vermutlich 2345
lrResult :=DINT_TO_LREAL(diTest) / 1000.0; ---> ergibt vermutlich 2.3449999999999997513100424
Egal ob man nun höchst umständlich mit EXPT(10,3) rechnet (*) oder gleich die Konstante 1000.0 verwendet, das Ergebnis wird einer LREAL-Variable zugewiesen und die enthält danach den Wert 2.3449999999999997513100424
(*) Vielleicht ist der ST-Compiler auch so intelligent wie ich

und erkennt, daß er den Ausdruck EXPT(10,3) durch die Konstante 1000.0 ersetzen kann?
Wir verschicken drei Zahlen in unsere Cloud.
[...]
2. 2.345000000 (LREAL)
[...]
2. --> in der Cloud wird 2.345 angezeigt, da die LREAL automatisch die restliche Nullen abschneidet (beim REAL passiert das nicht)
Daß die Cloud 2.345 anzeigt muß einen anderen Grund haben - vermutlich rundet die selber die Ausgabe auf höchstens 9 Nachkommastellen?
Du denkst, Du verschickst 2.345000000, tatsächlich wird aber 2.3449999999999997513100424 oder 2.3450000000000001953992523 verschickt.
Bitte beschäftige Dich mit den Grundlagen von Gleitkommazahlen nach IEEE 754, siehe die Links in Beitrag #7
Harald