Es ist nun mal so, dass eine Division meistens nicht ohne Rest aufgeht, und dass manche Zahlen (wie Wurzel(2) oder pi) sich nicht mit einer endlichen Zahl von Dezimalstellen genau darstellen lassen. Damit sich die Fehler nicht aufschaukeln, darfst du nie mit gerundeten Werten rechnen. Gerundete Werte nur für die Ausgabe. Und wenn sich die Prozente in der Ausgabe nicht zu 100 addieren, dann ist das halt so. Schreib unter die Tabelle eine Erklärung, dass sich das wegen Rundungsfehlern in der Darstellung so ergibt, die Rechnung selbst wurde mit größtmöglicher Genauigkeit durchgeführt.
Der Rückgabe-Wert von TryStrToFloat is übrigens boolean, du wendest die Funktion so an, als wäre das Double. Wahrscheinlich meinst du StrToFloat. Aber wiegesagt, jeden Faktor zuerst auf drei Stellen zu runden und dann zu multiplieren,. wird mit Sicherheit ein sehr falsches Ergebnis liefern. Besser ist, zuerst zu multiplieren und dann zu runden:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
const
Breite = 1.23451;
Hoehe = 4.694356;
Laenge = 3.5433453;
var
qm: Double;
begin
qm := StrToFloat(Format('%.3f', [Breite])) * StrToFloat(Format('%.3f', [Hoehe])) * StrToFloat(Format('%.3f', [Laenge]));
ShowMessage(FormatFloat('0.000', qm));
qm := Laenge * Breite * Hoehe;
ShowMessage(FormatFloat('0.000', qm));
end;