Seite 1 von 1
Runden
Verfasst: Mo, 22.01.2007 11:42
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
Verfasst: Mo, 22.01.2007 12:51
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.
Verfasst: Mo, 22.01.2007 13:05
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.
Verfasst: Mo, 22.01.2007 13:23
von toni
Danke Steffan, genau danach habe ich gesucht!!!
Gruss
Thomas
Re: Runden
Verfasst: Mo, 01.10.2007 16:06
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
Re: Runden
Verfasst: Di, 24.06.2008 16:39
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
Re: Runden
Verfasst: Mo, 15.09.2008 11:08
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