@sibru:
Erstens. Ich sehe da keinen Unterschied:
Code: Alles auswählen
Procedure.d Str2NumD(NumStr$)
Protected Komma = FindString(NumStr$, ".", 1)
If Komma = 0 : Komma = FindString(NumStr$, ",", 1): EndIf
If Komma
NumStr$ = Left(NumStr$, Komma - 1) + Mid(NumStr$, Komma + 1)
ProcedureReturn Val(NumStr$) / Pow(10, Len(NumStr$) - Komma + 1)
Else
ProcedureReturn ValD(NumStr$)
EndIf
EndProcedure
Debug Str2NumD("0.11")
Debug ValD("0.11")
Debugger hat geschrieben:0.1100000000000000005551115
0.1100000000000000005551115
Es kommt da auch nirgendwo 0.10999999 raus.
Zweitens. Man kann Fließkommazahlen nicht genauer machen. Sie arbeiten mit dem Binärsystem.
Genau wie du im Dezimalsystem ⅓ als 0.33333333333… darstellen musst, wäre es im Dreiersystem lediglich 0.1, also ohne Periode.
0.1 im Dezimalsystem wäre im Binärsystem dann 0.00011001100110011..., also wiederum periodisch und somit unendlich lang. Die Zahl 0.1 kann man also im Binärsystem nicht exakt speichern, weshalb die Nachkommastellen ab einer bestimmten Stelle abgeschnitten werden. Bei der Rücktransformation ins Dezimalsystem tauchen diese fehlenden Nachkommastellen dann wieder als Fehler auf. Nehmen wir mal an, wir hätten die Binärdarstellung so beschnitten: 0.00011001100110011, dann käme nach der Umwandlung ins Dezimalsystem das hier raus: 0.09999847412109375.