rundungsfehler beim berechnen von spaltenbreiten

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

rundungsfehler beim berechnen von spaltenbreiten

Beitrag von kannenklaus »

hallo

in einem makro werden werte von spaltenbreiten in cm z.b. 1,10 aus einem dialog ausgelesen und festgelegt. anschließend läuft ein makro und bildet die summe über die spalten. dabei kommt es zu rundungsfehler in der 2. nachkommastelle ab der 5.spalte.

Code: Alles auswählen

'--Makro, das Gesamtbreite der Spalten A bis K ermittelt
Sub GesamtBreiteErmitteln
	Dim iGesamtbreite as double
	calcDoc = ThisComponent
	oAktivesBlatt = calcDoc.CurrentController.activeSheet
	
'--F/N-Schleife für die Spalten A bis K
	For I = 0 to 10
	'ermittelt die Gesamthöhe der jeweiligen Zeilen und zeigt diese im Dialog an
	   iGesamtbreite = iGesamtbreite + oAktivesBlatt.Columns(I).width/1000 
	   oDlg.getControl("numGesamtbreite").value = iGesamtbreite
	next

End Sub
zeigt man die werte in einer msgbox an, werden 4 nachkommastellen gezeigt, die nicht genau den eingegeben werten entsprechen. dies trifft auch bei standardbreiten von starcalc zu.

Code: Alles auswählen

Sub testSpBreite
Dim oDlg as Object
Dim calcDoc as Object
Dim oAktivesBlatt as Object
Dim i as integer
Dim h as double
	calcDoc = ThisComponent
	oAktivesBlatt = calcDoc.CurrentController.activeSheet
	
	for i = 0 to 10
	h = h+oAktivesBlatt.Columns(i).width/1000
	msgbox("Zeile: "+i+Chr(13)+"Höhe: "+h,1, "Test")
	
	next
End Sub
meine frage ist nun:
kann ich die variablendeklaration mit double/single so beeinflussen, dass diese nur 2. nachkommastellen erfasst oder kann ich das problem bei den nummernfeldern des dialogs lösen.

freue mich auf eine antwort

grüße klaus
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Klaus,

(brauchst du das wirklich so genau? OOo Calc ist doch kein CAD-System :wink: )

Tia, das ist generell die Problematik bei Rechnen mit Kommastellen. Um exakt zu rechnen, musst du in einem Computer immer ganze Zahlen nehmen - dann hast du innerhalb einer gewissen Begrenzung exakte Zahlen. Keine Divisionen, keine Kommastellen. Sonst wird es immer ungenau - eben Rundungsfehler.
Auf dein Problem zugeschnitten: Multipliziere die eingegeben Spaltenbreiten nach dem Auslesen mit 100, schneide die Nachkommatellen ab, oder nutze besser gleich die Einheit 100stel Millimeter - die nutzt OOo intern auch. Jetzt mache alle deine Berechnungen mit diesen Zahlen - dann sollte das schon passen.
Als Variablen-Typ wählst du nur integer (bis max. +/- 32.768) oder Long (bis +/- 2.147.483.648) weder Single noch double.
Etwas wirst du dennoch nicht ganz hinbekommen: Die Anzeige-Darstellung rechnet intern in TWIPS, und da gibt es dann leider dennoch Umrechnungsungenauigkeiten.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
kannenklaus
*****
Beiträge: 319
Registriert: Mi, 14.12.2005 08:08
Wohnort: freising - oder dort, wo das bier herkommt

Beitrag von kannenklaus »

hallo thomas,
Als Variablen-Typ wählst du nur integer (bis max. +/- 32.768) oder Long (bis +/- 2.147.483.648) weder Single noch double.
danke für den tipp. werde nun mit dem 1/100 rechnen. die versprechen ja eine genauigkeit, die dann so wohl nicht umgesetzt wird.

beste grüße

klaus
Antworten