[Вопрос] Fließkommazahlen Runden [Решен]

Теги:
  • Visual scripting
  • Runden

Hallo,

gibt es aktuell eine Möglichkeit Fließkommazahlen auf eine gewünscht Anzahl von Nachkommastellen zu Runden,
oder ist diesbezüglich ein Node in Planung?
Der Node "CalculateMass" wirft aktuell Fließkommazahlen mit 16 Stellen bzw. mit bis zu 15 Nachkommastellen aus...was als Attributwert für m2 oder m3
wohl "etwas übergenau" sein könnte...
(Die einzige Rundungsmöglichkeit die ich bisher gefunden habe, ist über den Node "OperatorDivision" wobei dieser aber wiederum nur auf ganze Zahlen rundet)

Grüße,
Mario

Show solution Hide solution

In dem Node "FunctionX" könntest Du die Python-Function round(number, digits) benutzen.

In dem Node "FunctionX" könntest Du die Python-Function round(number, digits) benutzen.

Nemo hat ja schon den naheliegensten Weg beschrieben.
Hier noch eine Ergänzung:

Möchte man Zahlenwerte als Beschriftung mit dem Node 2DText absetzen und verwendet dazu die Funktion round(), werden Nullen die ab der zu rundenden Stelle auftreten nicht mit dargestellt. Was logisch ist, weil folgende Nullen mathematisch unnötig sind.
Außerdem wird beim Runden auf eine Ganzzahl (also auf 0 Nachkommastellen) immer .0 angehängt.

Aus 1.203 wird bei Rundung auf zwei Nachkommastellen 1.2 und nicht 1.20. Weiter wird aus dem Wert 4.02 beim Runden auf null Nachkommastellen 4.0 und nicht 4.
Das liegt daran, dass der Datentype float immer das Dezimaltrennzeichen und mindestens eine Nachkommastelle wiedergibt. Im Gegensatz zu integer.

Will man gerundete Zahlenwerte als Text absetzen, kann man das mit der F-String-Formatierung machen. Diese wandelt den Wert nicht nur in einen String mit bestimmter Formatierung um, sie rundet den Wert auch.
Ich mache das immer mit dem Node FunctionXY und schreibe unter Function f'{x:.{y}f}'. X sind die zu rundenden Werte und y ist die Anzahl der Nachkommastellen.

Wichtig:
Die F-String-Formatierung gibt Werte vom Typ str aus und die Funktion round() gibt Werte vom Typ float aus.
Bei beiden Funktionen ist zu beachten, dass symmetrisch gerundet wird. Was vielleicht wichtig ist, wenn es um die Beschriftung von Längen geht.
https://de.wikipedia.org/wiki/Rundung

Meine Erklärung beruht auf bescheidenen Programmierkenntnissen. Wenn in meinen Ausführungen etwas nicht stimmt, bitte ich um Berichtigung.

Gruß Felix

Gruß Felix
Allplan 2024-0-1

Вложения (3)

Type: text/xml
Загружено 1045 раз
Size: 9,92 KiB
Type: image/png
Загружено 113 раз
Size: 35,48 KiB
Type: image/png
Загружено 73 раз
Size: 105,24 KiB

Mario hatte vor, die Zahl (das Ergebnis der Volumenberechnung) vor dem Ablegen in einem (numerischen) Attribut zu runden!

Die Antwort von Felix zeigt richtigerweise die korrekt Richtung auf, nämlich dass man das Runden doch besser erst bei der Anzeige/Ausgabe des Wertes machen sollte!
Wenn man vorher rundet, entstehen bei weitere Verwendung dieses gerundeten Wertes größere Fehler z.B. beim Aufsummieren in einem Report.

Also bitte die korrekten Werten um Attribut ablegen, damit der Report mit diesen korrekten Werten rechnen kann.
Der ermittelte Wert kann gar nicht "übergenau" sein. Es ist einfach der ermittelte Wert!

Erst im Report/ Beschriftungsbild selbst sollte man die gewünschte Genauigkeit (der Anzeige) des Ergebnisses dann einstellen.

Hallo Nemo,
hallo Felix,

danke für eure Rückmeldungen und Erläuterungen!

@Nemo: Ja, ich will die Werte eigentlich nur vor der Ausgabe als Report bzw. Attribut am Objekt Runden.
Z.B.: alle m, m2, & m3 Werte mit max. zwei Nachkommastellen.
(für die weiteren Berechnungen innerhalb des Scripts verwende ich grundsätzlich nur die nicht gerundeten bzw. unverfälschten Ergebnisse - eh klar)

Danke für den Hinweis auf den "FunctionX" Node, den hatte ich noch gar nicht auf dem Schirm, werde ich mir gleich mal ansehen!

Grüße,
Mario

Achtung: Das Speichern von gerundeten Werten im Attribut führt zu Summenfehlern im Report!
Deshalb nur die ermittelten Werte ohne Rundung im Attribut speichern!
Runden sollte man immer erst nach dem Summieren und auch nur bei der Anzeige des Wertes!

Was muss ich eingeben, wenn ich die Gesamtsumme im Report auf die nächste Ganzzahl aufrunden möchte?
z.B. 4.2 soll 5 werden?
Danke