Runden

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

Moderator: Moderatoren

toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Runden

Beitrag von toni »

Hi,

ich möchte mit Starbasic runden:

auf eine Nachkommastelle:
100,123 ==> 100,1
100,511 ==> 100,2

auf Hunderter:
1111 ==> 1100
1151 ==> 1200

auf Tausender:
1111 ==> 1000
1511 ==> 2000

In VBA gibt es die Möglichkeit 'Application.WorksheetFunction.Round'. Gibt es in Starbasic ähnliches, oder hat jemand ein Workaround?


Gruss

Thomas
pmoegenb
********
Beiträge: 4330
Registriert: Di, 22.06.2004 12:02
Wohnort: 71134 Aidlingen
Kontaktdaten:

Beitrag von pmoegenb »

Hallo Thomas,

weshalb bemühst dazu nicht die Online-Hilfe. Zitat aus Online-Hilfe:

RUNDEN
Gibt eine auf eine festgelegte Anzahl von Nachkommastellen gerundete Zahl zurück.

Syntax:
RUNDEN(Zahl; Anzahl)
Zahl ist die Zahl, die gerundet werden soll.
Anzahl (optional) ist die Anzahl der Stellen, auf die gerundet werden soll. Ist der Parameter Anzahl negativ, so wird auf Vorkommastellen gerundet.
Beispiel:
Wenn Sie 17,546 in das Feld Zahl eingeben und 1 als Anzahl der Stellen festlegen, auf die gerundet werden soll, erhalten Sie das Ergebnis 17,5.
Gruß

Peter
---------------------------------------------------------------------------
Windows 7 Prof. 64-bit SP1, LibreOffice 4.3.6.2 und AOO 4.1.1
Steffan
****
Beiträge: 125
Registriert: Mi, 21.06.2006 10:07
Wohnort: Dresden

Beitrag von Steffan »

Hallo Thomas,

soweit ich weiß kannst Du auf die Calc-Funktionen nicht direkt in StarBasic zugreifen. Folgende Funktion macht das gleiche wie der Calc-Befehl runden:

Code: Alles auswählen

sub testRunden
	dblWert=1234.56789
	msgbox runden(dblWert)	
	msgbox runden(dblWert,3)
	msgbox runden(dblWert,-2)
	dblWert=9876.54321
	msgbox runden(dblWert)
	msgbox runden(dblWert,3)
	msgbox runden(dblWert,-2)
End sub

Function runden(dblZahl as double, optional iStellen as integer) as double
' Funktion rundet eine Zahl (dblZahl) auf die angegebene Anzahl von Stellen (iStellen)
' Angabe der Stellenanzahl optional (Standard=0)
	dim dblTmp as double, dblDif as double
	if isMissing(iStellen) then iStellen = 0
	dblTmp = (int(dblZahl * 10 ^ iStellen))/(10 ^ iStellen)
	dblDif = 10 ^ ((-1) * iStellen)
	if dblZahl-dblTmp>dblDif/2 then
		dbltmp=dbltmp + dblDif
	endif
	runden=dblTmp
end Function
Steffan.
toni
***
Beiträge: 66
Registriert: Mi, 03.01.2007 10:26

Beitrag von toni »

Danke Steffan, genau danach habe ich gesucht!!!

Gruss

Thomas
ch.schmidt
Beiträge: 9
Registriert: Mo, 26.03.2007 07:21

Re: Runden

Beitrag von ch.schmidt »

Hallo Steffan,

deine Funktion find ich Klasse aber ich habe ein Problem mit der 5 als letzte Stelle.
Ich habe die Funktion mal mit (4.45, 1) aufgerufen. Dann rundet OO Basic bei mir auf 4.4, weil OO Basic aus dblZahl-dblTmp (4.45 - 4.4) 4,99999999999998E-02 macht.

Kann man das irgendwie beeinflussen?

Grüße Christian
erikafuchs
******
Beiträge: 690
Registriert: Di, 13.02.2007 17:38
Wohnort: Büttelborn

Re: Runden

Beitrag von erikafuchs »

Lieber Christian,
deine Frage ist zwar schon ein Weilchen her, aber vielleicht interessiert sich ja jemand für meine Lösung.
Ich habe festgestellt, dass der Befehl "format" richtig rundet. Hier wird die zahl2 auf zahl1 Stellen gekürzt:

Code: Alles auswählen

 dim komma, rundungsstelle, naechstestelle as integer
 dim kommaformat as string
 dim zahlformat(1) as string
select case zahl1
case > 0
   komma= InStr(zahl2,",")
   rundungsstelle=mid(zahl2,komma+zahl1,1)
   naechstestelle=mid(zahl2,komma+zahl1+1,1)
   zahlformat(1) = (String(zahl1,"0"))
   zahlformat(0) = "0"
   kommaformat =join(zahlformat(),".")
   Loesung =format(Cstr(zahl2),kommaformat)
case < 0
   zahl1=zahl1*(-1)
   Loesung =Clng(zahl2/10^zahl1)*10^zahl1   
case else 
   Loesung =format(CStr(zahl2),"0")
end select
Grüße
Pit
ch.schmidt
Beiträge: 9
Registriert: Mo, 26.03.2007 07:21

Re: Runden

Beitrag von ch.schmidt »

Hallo,

ich habe nun festgestellt, dass auch die Funktionen Int(), CInt() und CLng() richten runden und habe die Funktion wie folgt geändert:

Code: Alles auswählen

Function runden(dblZahl as double, optional iStellen as integer) as double
' Funktion rundet eine Zahl (dblZahl) auf die angegebene Anzahl von Stellen (iStellen)
' Angabe der Stellenanzahl optional (Standard=0)
   dim dblTmp as double, lngTmp as Long
   if isMissing(iStellen) then iStellen = 0
   dblTmp = dblZahl * 10^iStellen
   lngTmp = CLng(dblTmp)
   dblTmp = CDbl(lngTmp) / 10^iStellen
   runden = dblTmp 
end Function
Grüße
Christian
Antworten