Anzahl Ziffern begrenzt? (gelöst)
Übersicht

![]() |
SereyanneBetreff: Anzahl Ziffern begrenzt? (gelöst) |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
kann das sein, dass die Ziffernanzahl, mit denen BB rechnen kann, irgendwie begrenzt ist? Ich bastel mir ja grad eine Art Taschenrechner. Wenn ich da jetzt eine Zahl eingebe wie 12345,67 zeigt er davon nur 12345,6 an. Lasse ich eine Ziffer vor dem Komma weg, werden beide Nachkommastellen aufgeführt. Woran liegt das? LG Sereyanne |
||
- Zuletzt bearbeitet von Sereyanne am Do, Mai 17, 2012 20:31, insgesamt einmal bearbeitet
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
32bit Float Zahlen (die man in Blitz zur Verfügung hat), haben maximal 7 Dezimalstellen Genauigkeit. Das ist eine Limitierung des Dezimalformats, nicht von Blitz.
Zwar hat man in anderen Sprachen Double (64bit Dezimalzahl) zur Verfügung, die ca. 16 Dezimalstellen Genauigkeit haben, die gibt es aber in Blitz leider nicht. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mist.... Damit ist dann mein Projekt wohl gescheitert.
Danke für die schnelle Antwort. Edit: Hab ich denn eine Möglichkeit, ein externes Programm aufzurufen und dessen Fenstergröße anzupassen? |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn die Zahlen nicht allzu groß werden, rechne doch einfach mit Integern. | ||
Starfare: Worklog, Website (download) |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie soll das gehen mit Nachkommastellen?
Ich brauche einen Rechner, der mir zuverlässig auch von Zahlen bis 100.000 Prozente berechnet. Ich bin auf die Nachkommastellen angewiesen. In der Buchhaltung ist jeder Cent wichtig. Der darf nicht einfach gerundet werden. Kann ich denn eine externe Anwendung starten und dessen Fenstergröße festlegen? |
||
![]() |
ZaP |
![]() Antworten mit Zitat ![]() |
---|---|---|
In der Buchhaltung rechnet man mit Integern, und zwar in Cents (oder auch Zehntel-Cents, je nach dem wie genau man's braucht). Mein Softwareprof würde dich verprügeln, wenn er wüsste, dass Du mit Floats in dem Anwendungsbereich rechnest ![]() |
||
Starfare: Worklog, Website (download) |
![]() |
ozzi789 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Verwende einen Integer für die Zahl ansich
Verwende einen Integer für die Stelle der Dezimalstelle Ansonsten such mal nach Stringrechner hier im Forum |
||
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5 |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm. Also den Bereich vor dem Komma in einen Integer wandeln und den Bereich nach dem Komma auch? Die Zahl quasi splitten?
Warum ist mir das nicht eingefallen.... Die Idee hat was. Danke! Wobei... wie soll ich dann damit rechnen, wenn ich zwei Zahlen hab? So ganz komm ich noch nicht dahinter. |
||
Tritium |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich weiß nicht, ob ich Dich richtig verstanden hab, aber sagen wir mal, Du möchtest Cent-genau mit Euros rechnen. Dann wäre meines Erachtens folgendes das einfachste:
Code: [AUSKLAPPEN] Startwert: 763,94€
In Cent umrechnen (x100): 76394,00Cent In Integer umwandeln (= Nachkommastellen abschneiden): 76394 Cent Alternativ wäre folgendes möglich: Stelle sicher, dass Du als Eingangsgröße immer Euro mit zwei Nachkommastellen hast (also 1,23€; 43,10€; 7,00€). Dann in einen String umwandeln und per Replace ![]() |
||
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, auch eine gute Idee.
Aber leider nicht brauchbar für größere Zahlen. Oder was mach ich z.B. mit 81.523,68? Wenn ich das in Cent umrechne, hab ich 8.152.368 - das ist schon eine Stelle zuviel, da fängt BB an zu runden. |
||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wandel die Eingabe niemals in einen Float, dann rundet Blitz auch nicht. Nimm die Methode mit Replace, die Tirtium erwähnt hat.
Streich quasie jedes Vorkommen eines Floats in deinem Programm. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Lakorta |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn es um echtes Geld geht und jeder Cent wichtig ist, dann lass auf jeden Fall die Finger von Floats! Bei der Ausgabe des Betrags kannst du die benutzen, aber niemals beim Rechnen. Da können fatale Fehler bei entstehen, und die wirken sich bei Multiplikation/Division dann nicht nur im Cent-Bereich aus. | ||
--- |
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Floats haben - wenn ichs richtig verstanden hab - einen anderen aufbau als normale werte (wie integer) - sie bestehen zum einen aus einer zahl und zum anderen aus einer rechnung. Die rechnung nähert den nachkommabereich an, dh sie sind bei wenigen nachkomma-stellen noch brauchbar, bei vielen werden sie aber zunehmend ungenauer.
Ebenso wenn sie zu groß werden - sprich wenn zuviel "vor" dem komma steht, dann bleibt weniger platz für den nachkomma bereich. So oder so ähnlich, aber auf jedenfall: Finger weg von floats wenn die genauigkeit wichtig ist! Die string idee will mir persöhnlich zwar nicht gefallen, aber die alternative wäre viel rumgefusche mit integern, wenn auch "richtig große zahlen" benötigt werden. Ich würde den eurobetrag * 1000 oder 10000 nehmen und damit weiterrechnen & nur zur ausgabe wieder die division einbringen. *100 wären normale cents, aber da werden zehntel cents nicht beachtet - wenn auch diese wichtig sind, den faktor erhöhen. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sucht einfach im Codearchiv nach "Stringrechner" und ihr findet die Lösung solcher Probleme ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso, also mit Integern kann ich dann mit mehr Ziffern arbeiten als bei Float? Okay, das hatte ich so noch nicht kapiert.
Dann danke ich euch recht herzlich für diesen Denkanstoß. Dann ist es natürlich kein Problem, alles x100 in Cent umzurechnen. @BladeRunner: Ich habe schon nach Stringrechnern gesucht. Das Problem ist, bei meinen Kenntnissen, da durch den Code durchzublicken, so dass ich ihn nach meinen Wünschen anpassen und verbauen kann. Danke nochmal!! |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit Integer hast du einen Bereich von +/- 2 Milliarden, also 9 ganze und eine stark eingeschränkte Stelle.
Arbeite Dich in die Stringrechner ein und Du hast nahezu beliebig große Zahlen. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
PhillipK hat Folgendes geschrieben: Ich würde den eurobetrag * 1000 oder 10000 nehmen und damit weiterrechnen & nur zur ausgabe wieder die division einbringen. *100 wären normale cents, aber da werden zehntel cents nicht beachtet - wenn auch diese wichtig sind, den faktor erhöhen.
Okay - jetzt hab ich das nächste Problem: Was mache ich bei Division? Wenn ich einen Integer habe und durch eine Zahl teile, kommt fast immer eine Zahl mit Nachkommastellen raus. Da komm ich um Floats nicht herum, und dann wird es ungenau. Mist... da bleibt mir jetzt das tagelange Einlesen in die Stringrechner wohl doch nicht erspart. ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die fertigen codes im Archiv sollten eigentlich alle Funktionen zur Verfügung stellen, ohne tagelanges lesen ![]() |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du tatsächlich nur im kaufmännischem Bereich rechnen willst, ist bei der Division der Nachkommabereich uninteressant. Daher würde ich bei INTEGER bleiben. Dabei beschreibt der Wert immer den Cent-Betrag, also bereits eigentlich mit immer 2 "Nachkommastellen"
Das geht auch bei Divisionen und Prozenzrechnungen gut: Beispiel 8.33% von 43,21 EUR Im INTEGER 4321*833=3599393 3599393/10000=359 sind also als String 3,59 EUR wie du siehst wäre das Ergebnis sogar noch genauer vorhanden: sind also als String 3,599393% Ähnlich die Division: Wieviel Prozent sind 43,21 EUR von 56,78 EUR? Im INTEGER 4321*10000=43210000 43210000/5678=7610 Es sind als String 76,10% du kannst bei Divisionen die Genauigkeit auch kurzfristig erhöhen, um dann im nachfolgenden String mehr Nachkommastellen zu erzeugen. Dabei multiplizierst du mit 100 und hast dann 4 Nachkmmastellen, oder mit 10000 und hast 6 Nachkommastellen z.b. 0,12 EUR werden 45 Teile zerlegt. Wieviel ist in jedem Teil? OHNE ERHÖHEN: 12/45=0 als String 0,00 EUR MIT ERHÖHEN um 2 weitere Nachkomma-Stellen: 12*100=1200 1200/45=26 als String 0,0026 MIT ERHÖHEN um 4 weitere Nachkomma-Stellen: 12*10000=120000 120000/45=2666 als String 0,002666 |
||
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe |
![]() |
Sereyanne |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich hab mich jetzt in Rallimens Stringrechner eingearbeitet.
Also erst mal herzlichen Dank für diesen schönen Code! Der Einstieg war doch leichter, als ich dachte. ![]() Aber es könnte sein, dass ich einen Fehler gefunden habe. Oder ich mach irgendwas falsch. Mein Code: (Code geändert, ich nehm jetzt den Original Code mit den Zahlen, wo er Fehler macht, dann ist es hoffentlich leichter zu sehen was ich meine) Code: [AUSKLAPPEN] Function Subtrahieren$ (Wert1$,Wert2$)
If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If (w1% + w2%) Then If W1% Then If W2% Then Select Dividieren_Vergleichen (wert1$,wert2$) Case 0 Return "0" Case 1 Return "-" + Subtrahieren$ (Wert1$,Wert2$) Case 2 Return Subtrahieren$ (Wert2$,Wert1$) End Select Else Return "-" + Addieren$ (Wert1$,Wert2$) End If Else If w2 Then Addieren$ (Wert1$,Wert2$) End If End If Select Dividieren_Vergleichen (wert1$,wert2$) Case 0 Return 0 Case 2 Return "-" + Subtrahieren$ (Wert2$,Wert1$) End Select If Len (wert1$) > Len (wert2$) Then wert2$ = RSet (wert2$,Len (wert1$) ) Else wert1$ = RSet (wert1$,Len (wert2$) ) End If While Len (wert1$) > 8 zw = (Int (Right (wert1$,8) ) - Int (Right (wert2$,8) ) - c%) wert1$ = Left (wert1$ , Len (wert1$) - 8) wert2$ = Left (wert2$ , Len (wert2$) - 8) If zw < 0 Then zw = 100000000 + zw c% = 1 Else c% = 0 End If If Len (Str (zw) ) < 8 Then zwS$ = Replace (RSet (zw,8) ," ","0") returnWert$ = Right (zwS$,8) + returnWert$ Else returnWert$ = zw + returnWert$ End If Wend zw = (Int (Right (wert1$,8) ) - Int (Right (wert2$,8) ) - c%) returnWert$ = zw + returnWert$ While Left (returnWert$,1) = "0" returnWert$ = Mid (returnWert$,2) Wend Return returnWert$ End Function Function Addieren$ (Wert1$,Wert2$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If (w1% + w2%) Then If w1% Then If w2% Then Return "-" + Addieren$ (Wert1$,Wert2$) Else Select Dividieren_Vergleichen (wert1$,wert2$) Case 0 Return "0" Case 1 Return "-" + Subtrahieren$ (Wert1$,Wert2$) Case 2 Return Subtrahieren$ (Wert2$,Wert1$) End Select End If Else Select Dividieren_Vergleichen (wert1$,wert2$) Case 0 Return "0" Case 1 Return Subtrahieren$ (Wert1$,Wert2$) Case 2 Return "-" + Subtrahieren$ (Wert2$,Wert1$) End Select End If End If If Len (wert1$) > Len (wert2$) Then wert2$ = RSet (wert2$,Len (wert1$) ) Else wert1$ = RSet (wert1$,Len (wert2$) ) End If While Len (wert1$) > 8 zw$ = (Int (Right (wert1$,8) ) + Int (Right (wert2$,8) ) + c%) If Len (zw) < 9 Then zw = Replace (RSet (zw,8) ," ","0") If Len (zw$) > 8 Then c% = 1 zw$ = Mid (zw$,2) Else c% = 0 End If returnWert$ = Right (zw$,8) + returnWert$ wert1$ = Left (wert1$ , Len (wert1$) - 8) wert2$ = Left (wert2$ , Len (wert2$) - 8) Wend Return (Int (wert1$) + Int (wert2$) + c) + returnWert$ End Function Function Addieren_Komma$ (Wert1$,Wert2$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If (w1% + w2%) Then If w1% Then If w2% Then Return "-" + Addieren_Komma$ (Wert1$,Wert2$) Else Select WertVergleichenKomma% (Wert1$,Wert2$) Case 0 Return "0" Case 1 Return "-" + Subtrahieren_Komma$ (Wert1$,Wert2$) Case 2 Return Subtrahieren_Komma$ (Wert2$,Wert1$) End Select End If Else Select WertVergleichenKomma% (Wert1$,Wert2$) Case 0 Return "0" Case 1 Return Subtrahieren_Komma$ (Wert1$,Wert2$) Case 2 Return "-" + Subtrahieren_Komma$ (Wert2$,Wert1$) End Select End If End If If Instr (Wert1$,".") Or Instr (Wert2$,".") Then KommaZahl = 1 If Instr (Wert1$,".") Then w1_VorKomma$ = Left (Wert1$,Instr (Wert1$,".") - 1) W1_Rest$ = Mid (Wert1$,Instr (Wert1$,".") + 1) Else w1_VorKomma$ = Wert1$ End If If Instr (Wert2$,".") Then w2_VorKomma$ = Left (Wert2$,Instr (Wert2$,".") - 1) W2_Rest$ = Mid (Wert2$,Instr (Wert2$,".") + 1) Else w2_VorKomma$ = Wert2$ End If If Len (W1_Rest$) < Len (W2_Rest$) Then W1_Rest$ = LSet (W1_Rest$,Len (W2_Rest$) ) W1_Rest$ = Replace (W1_Rest$," ","0") Else W2_Rest$ = LSet (W2_Rest$,Len (W1_Rest$) ) W2_Rest$ = Replace (W2_Rest$," ","0") End If KommaStelle = Len (W2_Rest$) Wert1$ = w1_VorKomma$ + W1_Rest$ Wert2$ = w2_VorKomma$ + W2_Rest$ End If If Len (wert1$) > Len (wert2$) Then wert2$ = RSet (wert2$,Len (wert1$) ) Else wert1$ = RSet (wert1$,Len (wert2$) ) End If While Len (wert1$) > 8 zw$ = (Int (Right (wert1$,8) ) + Int (Right (wert2$,8) ) + c%) If Len (zw) < 9 Then zw = Replace (RSet (zw,8) ," ","0") If Len (zw$) > 8 Then c% = 1 zw$ = Mid (zw$,2) Else c% = 0 End If returnWert$ = Right (zw$,8) + returnWert$ wert1$ = Left (wert1$ , Len (wert1$) - 8) wert2$ = Left (wert2$ , Len (wert2$) - 8) Wend If KommaZahl = 1 Then ZWSumme$ = (Int (wert1$) + Int (wert2$) + c) + returnWert$ If Len (ZWSumme$) < KommaStelle Then ZWSumme$ = "0." + Replace (RSet (ZWSumme$,kommastelle) ," ","0") Else ZWSumme$ = Left (ZWSumme$, Len (ZWSumme$) - KommaStelle) + "." + Right (ZWSumme$, KommaStelle) End If While Right (ZWSumme$,1) = 0 ZWSumme$ = Left (ZWSumme$,Len (ZWSumme$) - 1) Wend If Right (ZWSumme$,1) = "." Then ZWSumme$ = Left (ZWSumme$,Len (ZWSumme$) - 1) Return ZWSumme$ Else Return (Int (wert1$) + Int (wert2$) + c) + returnWert$ End If End Function Function Subtrahieren_Komma$ (Wert1$,Wert2$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If (w1% + w2%) Then If W1% Then If W2% Then Select WertVergleichenKomma% (Wert1$,Wert2$) Case 0 Return "0" Case 1 Return "-" + Subtrahieren_Komma$ (Wert1$,Wert2$) Case 2 Return Subtrahieren_Komma$ (Wert2$,Wert1$) End Select Else Return "-" + Addieren_Komma$ (Wert1$,Wert2$) End If Else If w2 Then Return Addieren_Komma$ (Wert1$,Wert2$) End If End If Select WertVergleichenKomma% (Wert1$,Wert2$) Case 0 Return 0 Case 2 Return "-" + Subtrahieren_Komma$ (Wert2$,Wert1$) End Select If Instr (Wert1$,".") Or Instr (Wert2$,".") Then KommaZahl = 1 If Instr (Wert1$,".") Then w1_VorKomma$ = Left (Wert1$,Instr (Wert1$,".") - 1) W1_Rest$ = Mid (Wert1$,Instr (Wert1$,".") + 1) Else w1_VorKomma$ = Wert1$ End If If Instr (Wert2$,".") Then w2_VorKomma$ = Left (Wert2$,Instr (Wert2$,".") - 1) W2_Rest$ = Mid (Wert2$,Instr (Wert2$,".") + 1) Else w2_VorKomma$ = Wert2$ End If If Len (W1_Rest$) < Len (W2_Rest$) Then W1_Rest$ = LSet (W1_Rest$,Len (W2_Rest$) ) W1_Rest$ = Replace (W1_Rest$," ","0") Else W2_Rest$ = LSet (W2_Rest$,Len (W1_Rest$) ) W2_Rest$ = Replace (W2_Rest$," ","0") End If KommaStelle = Len (W2_Rest$) Wert1$ = w1_VorKomma$ + W1_Rest$ Wert2$ = w2_VorKomma$ + W2_Rest$ End If If Len (wert1$) > Len (wert2$) Then wert2$ = RSet (wert2$,Len (wert1$) ) Else wert1$ = RSet (wert1$,Len (wert2$) ) End If While Len (wert1$) > 8 zw = (Int (Right (wert1$,8) ) - Int (Right (wert2$,8) ) - c%) wert1$ = Left (wert1$ , Len (wert1$) - 8) wert2$ = Left (wert2$ , Len (wert2$) - 8) If zw < 0 Then zw = 100000000 + zw c% = 1 Else c% = 0 End If If Len (Str (zw) ) < 8 Then zwS$ = Replace (RSet (zw,8) ," ","0") returnWert$ = Right (zwS$,8) + returnWert$ Else returnWert$ = zw + returnWert$ End If Wend zw = (Int (Right (wert1$,8) ) - Int (Right (wert2$,8) ) - c%) returnWert$ = Replace (RSet (zw,8) ," ","0") + returnWert$ If KommaZahl = 1 Then returnWert$ = Left (returnWert$, Len (returnWert$) - KommaStelle) + "." + Right (returnWert$, KommaStelle) While Right (returnWert$,1) = 0 returnWert$ = Left (returnWert$,Len (returnWert$) - 1) Wend If Right (returnWert$,1) = "." Then returnWert$ = Left (returnWert$,Len (returnWert$) - 1) While Left (returnWert$,1) = "0" returnWert$ = Mid (returnWert$,2) Wend If Left (returnWert$,1) = "." Then returnWert$ = "0" + returnWert$ Else While Left (returnWert$,1) = "0" returnWert$ = Mid (returnWert$,2) Wend End If Return returnWert$ End Function Function Dividieren_Komma$ (Wert1$,Wert2$,Nachkomma% = 50) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If w1 + w2 = 1 Then Vorzeichen$ = "-" If Instr (Wert1$,".") Or Instr (Wert2$,".") Then If Instr (Wert1$,".") Then w1_VorKomma$ = Left (Wert1$,Instr (Wert1$,".") - 1) W1_Rest$ = Mid (Wert1$,Instr (Wert1$,".") + 1) Else w1_VorKomma$ = Wert1$ End If If Instr (Wert2$,".") Then w2_VorKomma$ = Left (Wert2$,Instr (Wert2$,".") - 1) W2_Rest$ = Mid (Wert2$,Instr (Wert2$,".") + 1) Else w2_VorKomma$ = Wert2$ End If If Len (W1_Rest$) < Len (W2_Rest$) Then W1_Rest$ = LSet (W1_Rest$,Len (W2_Rest$) ) W1_Rest$ = Replace (W1_Rest$," ","0") Else W2_Rest$ = LSet (W2_Rest$,Len (W1_Rest$) ) W2_Rest$ = Replace (W2_Rest$," ","0") End If Wert1$ = w1_VorKomma$ + W1_Rest$ Wert2$ = w2_VorKomma$ + W2_Rest$ End If While Nachkomma% If Len (Wert1) = 0 Then If Kommagesetzt Then ReWert$ = ReWert + "0" Nachkomma% = Nachkomma% - 1 Else Kommagesetzt = 1 ergebnis$ = ergebnis$ + "." ReWert$ = ReWert + "0" If Len (Replace (ReWert$,"0","") ) = 0 Then Exit End If Else ReWert$ = ReWert + Mid (wert1,1,1) wert1 = Mid (wert1,2) End If For i = 0 To 10 If Dividieren_Vergleichen (ReWert$,wert2$) = 2 Then ergebnis$ = ergebnis$ + i Exit Else ZwWert$ = Subtrahieren$ (ReWert$,wert2) ReWert$ = ZwWert$ End If Next Wend While Left (ergebnis$,1) = "0" ergebnis$ = Mid (ergebnis$,2) Wend If Left (ergebnis$,1) = "." Then ergebnis$ = "0" + ergebnis$ If Right (ergebnis$,1) = "." Then ergebnis$ = Left (ergebnis$,Len (ergebnis$) - 1) If Len (ergebnis$) = 0 Then ergebnis$ = "0" Return Vorzeichen$ + ergebnis$ End Function Function Dividieren$ (Wert1$,Wert2$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If w1 + w2 = 1 Then Vorzeichen$ = "-" While Len (wert1) ReWert$ = ReWert + Mid (wert1,1,1) wert1 = Mid (wert1,2) For i = 0 To 10 If Dividieren_Vergleichen (ReWert$,wert2$) = 2 Then ergebnis$ = ergebnis$ + i Exit Else ZwWert$ = Subtrahieren$ (ReWert$,wert2) ReWert$ = ZwWert$ End If Next Wend While Left (ergebnis$,1) = "0" ergebnis$ = Mid (ergebnis$,2) Wend If Len (ergebnis$) = 0 Then ergebnis$ = "0" Return Vorzeichen$ + ergebnis$ End Function Function Dividieren_Vergleichen (wert1$,wert2$) If Left (wert1$,1) = "0" Then While Left (wert1$,1) = "0" : wert1$ = Mid (wert1$,2) : Wend If Len (wert1$) = 0 Then wert1$ = "0" End If If Left (wert2$,1) = "0" Then While Left (wert2,1) = "0" : wert2 = Mid (wert2,2) : Wend If Len (wert2) = 0 Then wert2 = "0" End If a1 = Len (wert1$) a2 = Len (wert2$) If a1 > a2 Then Return 1 If a1 < a2 Then Return 2 If wert1$ > wert2$ Then Return 1 If wert1$ < wert2$ Then Return 2 Return 0 End Function Function Multiplizieren$ (Wert1$,Wert2$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If w1 + w2 = 1 Then Vorzeichen$ = "-" For i = 1 To Len (wert1$) Multipli% = Mid (wert1$,i ,1) dummy2$ = Wert2$ While Len (dummy2$) > 7 Akwert = Right (dummy2$,7) dummy2$ = Left (wert2$,Len (dummy2$) - 7) erg = Multipli% * Akwert + rest% If erg > 9999999 Then rest% = Left (erg ,1) erg = Right (erg ,7) Else rest = 0 End If If Len (Str (erg) ) < 7 Then ZwWert$ = Replace (RSet (erg,7) ," ","0") + ZwWert$ Else ZwWert$ = Replace (RSet (erg,7) ," ","0") + ZwWert$ End If Wend rest% = Multipli% * Int (dummy2$) + rest% ZwWert$ = rest% + ZwWert$ rest = 0 If Len (dummy$) Then dummy$ = Addieren$ (ZwWert$ ,Dummy$ + "0") Else dummy$ = ZwWert$ End If ZwWert$ = "" Next Return Vorzeichen$ + dummy$ End Function Function Multiplizieren_Komma$ (Wert1$,Wert2$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) : w1% = 1 If Left (Wert2$ ,1) = "-" Then wert2$ = Mid (wert2$,2) : w2% = 1 If w1 + w2 = 1 Then Vorzeichen$ = "-" If Instr (Wert1$,".") Or Instr (Wert2$,".") Then KommaZahl = 1 If Instr (Wert1$,".") Then w1_VorKomma$ = Left (Wert1$,Instr (Wert1$,".") - 1) W1_Rest$ = Mid (Wert1$,Instr (Wert1$,".") + 1) Else w1_VorKomma$ = Wert1$ End If If Instr (Wert2$,".") Then w2_VorKomma$ = Left (Wert2$,Instr (Wert2$,".") - 1) W2_Rest$ = Mid (Wert2$,Instr (Wert2$,".") + 1) Else w2_VorKomma$ = Wert2$ End If If Len (W1_Rest$) < Len (W2_Rest$) Then W1_Rest$ = LSet (W1_Rest$,Len (W2_Rest$) ) W1_Rest$ = Replace (W1_Rest$," ","0") Else W2_Rest$ = LSet (W2_Rest$,Len (W1_Rest$) ) W2_Rest$ = Replace (W2_Rest$," ","0") End If KommaStelle = Len (W2_Rest$) Wert1$ = w1_VorKomma$ + W1_Rest$ Wert2$ = w2_VorKomma$ + W2_Rest$ End If For i = 1 To Len (wert1$) Multipli% = Mid (wert1$,i ,1) dummy2$ = Wert2$ While Len (dummy2$) > 7 Akwert = Right (dummy2$,7) dummy2$ = Left (wert2$,Len (dummy2$) - 7) erg = Multipli% * Akwert + rest% If erg > 9999999 Then rest% = Left (erg ,1) erg = Right (erg ,7) Else rest = 0 End If ZwWert$ = Replace (RSet (erg,7) ," ","0") + ZwWert$ Wend rest% = Multipli% * Int (dummy2$) + rest% ZwWert$ = rest% + ZwWert$ rest = 0 If Len (dummy$) Then dummy$ = Addieren$ (ZwWert$ ,Dummy$ + "0") Else dummy$ = ZwWert$ End If ZwWert$ = "" Next If KommaZahl = 1 Then If Len (dummy$) < KommaStelle * 2 Then dummy = "0." + Replace (RSet (dummy,KommaStelle * 2) ," ","0") Else dummy$ = Left (dummy$, Len (dummy$) - KommaStelle * 2) + "." + Right (dummy$, KommaStelle * 2) End If While Right (dummy$,1) = 0 dummy$ = Left (dummy$,Len (dummy$) - 1) Wend If Right (dummy$,1) = "." Then dummy$ = Left (dummy$,Len (dummy$) - 1) End If Return Vorzeichen$ + dummy$ End Function Function Square_Root$ (Wert1$) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) If Len (Wert1$) Mod 2 Then Wert1$ = " " + Wert1$ While Len (wert1) VonOb$ = Left (wert1,2) wert1 = Mid (wert1,3) If Abzieh$ = "" Then Abzieh$ = "1" Else Abzieh$ = Addieren$ (erg$,erg$) + "1" End If ReWert$ = ReWert$ + VonOb While Left (ReWert$,1) = "0" : Rewert = Mid (ReWert$,2) : Wend If Len (Rewert) = 0 Then Rewert = "0" For t = 0 To 10 If Dividieren_Vergleichen (ReWert$,Abzieh$) <> 2 Then ReWert$ = Subtrahieren$ (ReWert$,Abzieh$) Abzieh = Addieren$ (Abzieh,2) Else erg = erg + T Exit End If Next Wend Return erg End Function Function Square_Root_KOMMA$ (Wert1$,Nachkomma% = 50) If Left (Wert1$ ,1) = "-" Then wert1$ = Mid (wert1$,2) Nachkomma% = Nachkomma% - 1 If Left (Wert1$,1) = "."Then Wert1$ = "0" + wert1 If Instr (Wert1$,".") = 0 Then Wert1$ = Wert1$ + "." ;Vorm Komma und nach Komma Stellen durch 2 teilbar Dummy1$ = Left (Wert1$,Instr (Wert1$,".") - 1) If Len (Dummy1$) Mod 2 Then Dummy1$ = "0" + Dummy1$ Dummy2$ = Mid (Wert1$,Instr (Wert1$,".") + 1) If Len (Dummy2$) Mod 2 Then Dummy2$ = Dummy2$ + "0" Wert1$ = Dummy1$ + "." + Dummy2$ Repeat .Start If Len (Wert1) Then VonOb$ = Left (wert1,2) Else VonOb$ = "00" End If If Instr (VonOb$,".") Then Komma = Len (erg$) wert1 = Mid (wert1,2) Goto Start End If wert1 = Mid (wert1,3) If Abzieh$ = "" Then Abzieh$ = "1" Else Abzieh$ = Addieren$ (erg$,erg$) + "1" End If ReWert$ = ReWert$ + VonOb While Left (ReWert$,1) = "0" : Rewert = Mid (ReWert$,2) : Wend If Len (Rewert) = 0 Then Rewert = "0" For t = 0 To 10 If Dividieren_Vergleichen (ReWert$,Abzieh$) <> 2 Then ReWert$ = Subtrahieren$ (ReWert$,Abzieh$) Abzieh = Addieren$ (Abzieh,2) Else erg = erg + T Exit End If Next If Len (erg) - Komma > Nachkomma% Then Exit Forever If komma Then returnwert$ = Left (Erg$,Komma) + "." + Mid (Erg$,Komma + 1) Return returnwert$ Else Return erg End If End Function Function WertVergleichenKomma% (Wert1$,Wert2$) While Left (wert1$,1) = "0" Wert1 = Mid (wert1,2) Wend While Left (wert2$,1) = "0" Wert2 = Mid (wert2,2) Wend w1% = Instr (wert1$,".") w2% = Instr (wert2$,".") If w1 > w2 Then Return 1 If w1 < w2 Then Return 2 If Wert1$ > Wert2$ Then Return 1 If Wert1$ < Wert2$ Then Return 2 Return 0 End Function ;Integer Versionen ;-Addieren$ (Wert1$,Wert2$) ;-Subtrahieren$ (Wert1$,Wert2$) ;-Multiplizieren$ (Wert1$,Wert2$) ;-Dividieren$ (Wert1$,Wert2$) ;-Square_Root$ (Wert1$) ;Float Versionen ;-Addieren_Komma$ (Wert1$,Wert2$) ;-Subtrahieren_Komma$ (Wert1$,Wert2$) ;-Multiplizieren_Komma$ (Wert1$,Wert2$) ;-Square_Root_Komma$ (Wert1$,Nachkomma% = 50) ;-Dividieren_Komma$ (Wert1$,Wert2$,Nachkomma% = 50) ;wird von einigen der Functionen benötigt ;-Dividieren_Vergleichen(wert1$,wert2$) ;-WertVergleichenKomma%(Wert1$,Wert2$) ;nur für Floats ; ;;TEST ;TEST ;TEST ;TEST ;TEST ;TEST ;TEST ;TEST ;TEST ;TEST a$ = "150" Graphics 1200 ,200,16,2 Print "Startwert" Print a b$ = Addieren_Komma$ (A$ ,"2") Print b c$ = Multiplizieren_Komma$ (a$ , 3) Print c d$ = Dividieren_Komma$ (a$ , 3,5) Print d e$ = Subtrahieren_Komma$ (A$ ,"1.5") Print e WaitKey In dem Beispiel mit 150 und davon 1 subrahieren - warum bekomme ich ein Minusergebnis?? Mache ich aus der 1 eine 10, passt es. Woran liegts? Edit: Vergesst es! Eine PN an den Erschaffer dieses Codes und schon läuft der Rubel. Danke!! |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group