Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Ungenaues Runden

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Gloka



Anmeldungsdatum: 16.04.2013
Beiträge: 5

BeitragVerfasst am: 02.05.2016, 14:45    Titel: Ungenaues Runden Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Gloka



Anmeldungsdatum: 16.04.2013
Beiträge: 5

BeitragVerfasst am: 02.05.2016, 14:49    Titel: Kleiner nachtrag Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 02.05.2016, 17:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 02.05.2016, 18:25    Titel: Antworten mit Zitat

Der berühmte Artikel aus meiner Sammlung an dieser Stelle:

http://www.dreael.ch/Deutsch/BASIC-Knowhow-Ecke/Gleitkommazahlen.html

Eine mögliche Abhilfe hat ansonsten Jojo bereits angegeben.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Gloka



Anmeldungsdatum: 16.04.2013
Beiträge: 5

BeitragVerfasst am: 03.05.2016, 07:11    Titel: Antworten mit Zitat

Vielen Dank für die rasche Antwort!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1874
Wohnort: D59192

BeitragVerfasst am: 03.05.2016, 11:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz