Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Gloka
Anmeldungsdatum: 16.04.2013 Beiträge: 5
|
Verfasst am: 02.05.2016, 15:45 Titel: Ungenaues Runden |
|
|
Hallo zusammen
Ich hätte da eine Frage zum runden. Ich benutze dazu die Rundungsfunktion von ytwinky aus dem Tutorial.
Leider gibt mir das bei gewissen Zahlen kleine Rundungsfehler. Die
sehen wie folgt aus:
x.x0000000000001
oder
x.x9999999999999
Um diese Problem zu beheben habe ich versucht den Double inklusive den Nachkommastellen in einen String umzuwandlen und dann wieder zurück in einen double um die überflüssigen Stellen loszuwerden.
Leider hat es nicht geklappt.
Unten seht ihr meinen erweiterten Code am Beispiel der Zahl 91.94100189208984. Diese möchte ich auf eine Stelle nach dem Komma mathematisch runden also 91.9.
Leider funktioniert das nicht wirklich, könnte ihr mir da bitte helfen?
dim as double a
declare Function Runde (Variable as Double, Nachkomma as Integer) as double
Bei mir sieht die Ausgebe wie folgt aus:
Gerundete Variable= 91.90000000000001 Nachkommastelle= 1
Variable als Text= 91.90000000000001
GerundeteVariable als text=91.90 c= 4
Text wieder als Variable= 91.90000000000001 1
a= 91.90000000000001
Code: | dim as double a
declare Function Runde (Variable as Double, Nachkomma as Integer) as double
A=91.94100189208984
a=runde(a,1)'rundungs Function die Zahl gibt an wieviel Stellen nach dem Komma
print "a=" ;a
Function Runde(Variable as Double, Nachkomma as Integer) as double
dim as double c
dim as string text_
Dim Wert as Double=10^Nachkomma
Variable=CInt(Variable*Wert)/Wert 'Wert wird gerundet
:print"Gerundete Variable=";(Variable);:print" Nachkommastellen=";(Nachkomma) 'Ausgabe der fehlerhaften Rundung
'Hier der Versuch die Variabel in einen Text umzuwandeln um
'die fehlerhaften Rundung loszuwerden.
if abs(Variable)>=(10) and abs(Variable)<(100) then
c=3+Nachkomma
end if
text_=str(Variable) :print"Variable als text=";(text_)
text_=left(Text_,c) :print"GerundeteVariable als text=";(text_);:print" c=";c
Variable=val(Text_) :print"Text wieder als Variable=";(Variable)
Return (Variable)
End Function
sleep
|
|
|
Nach oben |
|
|
Gloka
Anmeldungsdatum: 16.04.2013 Beiträge: 5
|
Verfasst am: 02.05.2016, 15:49 Titel: Kleiner nachtrag |
|
|
Ich habe noch einen Fehler bemerkt bei der Ausgabe der Variabel als text wird 91.9 angezeigt und nich t 91.90
Gerundete Variable= 91.90000000000001 Nachkommastelle= 1
Variable als Text= 91.90000000000001
GerundeteVariable als text=91.9 c= 4
Text wieder als Variable= 91.90000000000001 1
a= 91.90000000000001 |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.05.2016, 18:51 Titel: |
|
|
Genauer können Gleitkommazahlen die von dir gewünschten Werte nicht ausgeben, egal wie viel du rundest. Lies den verlinkten Artikel durch und finde dich damit ab, dass du nicht mehr Genauigkeit aus Double-Variablen rausbekommst. Was du braucht, ist eine formatierte Ausgabe, um nur so viele Nachkommastellen wie benötigt auszugeben. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
|
Gloka
Anmeldungsdatum: 16.04.2013 Beiträge: 5
|
Verfasst am: 03.05.2016, 08:11 Titel: |
|
|
Vielen Dank für die rasche Antwort! |
|
Nach oben |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 03.05.2016, 12:38 Titel: |
|
|
Hi,
Beispiele die das Verhalten von FIX und FORMAT zeigt:
Code: | #Include Once "vbcompat.bi"'für Format()
ScreenRes 40*8,10*16,32
Width 40, 10
Dim As Double a=91.94600189208984
Dim As Double b=9.9999999999
Dim As Long Nachkomma = 2
Print a
Print Format(a, " ###." + String(Nachkomma,"0"))
Print Fix(a*10^Nachkomma)/10^Nachkomma
Print b
Print Format(b, " ###." + String(Nachkomma,"0"))
Print Fix(b*10^Nachkomma)/10^Nachkomma
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
|
|