Hallo Pit,
CDec sorgte dafür, dass ich eine "ordentliche" Kommazahl (0,1; 0,01; 0,001) bekam. Ohne habe ich mal eine zahl in Exponetialdarstellung (2,2E-02) die meine Schüler nicht lesen können oder sogar 2,200000003456, die sie nicht umwandeln können.
Das CDec für eine "ordentliche" Kommazahl sorgt, möchte ich bezweifeln. Denn woher soll denn CDec wissen wieviele Nachkommastellen "gewünscht" sind?
Ich lass mich aber eines besseren belehren.
Hat jemand eine Idee für einen Ersatz von CDec?
Nicht so wie Du es dir vielleicht vorstellst. Also anstatt CDec, so was wie CDezi {phantasiename}.
Ich benötige eine Funktion, die eine Dezimalzahl erzwingt ohne die Kommastellen vorzugeben.
Da würde ich mal so ganz spontan sagen: Vergess es!
Denn auch hier wieder der Einwand: Woher soll denn die Ersatzfunktion automatisch wissen wieviele Nachkommastellen "gewünscht" sind? Oder versteh ich irgendwas falsch?
Was Du wohl brauchst ist eine Rundungsfunktion.
Ich hatte beim testen deiner Datei einen sehr unschönen Effekt feststellen müssen, der da lautet:
Die Datei rechnet Falsch!
Aufgefallen war mir das bei "Kopfrechen Dezimalzahlen". Ich dachte das ich mich nur irgendwie verguckt hatte, aber auch im Protokollblatt ist das nachzulesen.
Aufgabe war:
9,1 - 8,9
Meine Eingabe, welche mathematisch korrekt ist, war:
0,2
Datei sagte aber Falsch! Und zeigte mir folgendes Ergebnis als angeblich richtige Lösung an:
0,199999999999999
Und im Protokollblatt steht nachzulesen:
9,1 - 8,9 = 0,199999999999999
Und das bleibt kein Einzelfall. Das kommt immer wieder vor, wenn das Ergebnis der Subtraktion kleiner 1,0 ist. Hier mal ein paar Ergebnisse als Beispiel.
10,1 - 9,4 0,699999999999999
10 - 9,8 0,199999999999999
10,1 - 9,3 0,800000000000001
9,1 - 8,9 0,199999999999999
9,4 - 8,6 0,800000000000001
Da bleibt dir wirklich nichts anderes übrig als noch eine zusätzliche Rechenfunktion einzubauen. Und als Vorschlag würde ich empfehlen die Calc-Funktion RUNDEN() zu nehmen. Besser gesagt der englische Name; ROUND. Und das würde dann in ungefähr so aussehen.
Als erstes die Deklaration.
Code: Alles auswählen
dim oFunctionAccess as Object
dim argument(1) as Variant
argument ist nur ein Beispiel, Du kannst natürlich auch einen anderen Bezeichner nehmen.
Nun musst Du noch die dementsprechende Subtraktions-Berechnung ändern, und das könnte wie folgt aussehen.
Code: Alles auswählen
zahl2 = CInt(rnd()*99+1)/10
zahl1 = (CInt(rnd()*979+1)/10+zahl2)
argument(0) = zahl1-zahl2
argument(1) = 1
erg = oFunctionAccess.callFunction("ROUND",argument())
Aufgabe = zahl1 & " - " & zahl2
argument(1) = 1 -> das ist der zweite Parameter von Runden, der die Nachkommastellen angibt. Und da könntest Du dann je nach Rechenaufgabe eine Variable mit den gewünschten Nachkommastellen mit übergeben. Also so was in der Form von: Nachkomma = 3 -> argument(1) = Nachkomma
Mit dieser zusätzlichen 'Function' würdest Du 2 Fliegen auf einmal erschlagen können. Die Exponetialdarstellung müsste dadurch entfallen, und das Makro gibt keine "blödsinnige" Ergebnisse mehr aus.
Ich bin mir jetzt nicht sicher ob man das auch ohne oFunctionAccess erledigen kann, aber ich denke mir das sich dieser zusätzliche Arbeitsaufwand durchaus lohnen wird. Also versuchs ruhig einmal, mehr als schiefgehen kann es ja nicht.
Gruß
balu