Anzahl Ziffern begrenzt? (gelöst)

Übersicht BlitzBasic BlitzPlus

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Sereyanne

Betreff: Anzahl Ziffern begrenzt? (gelöst)

BeitragSa, Mai 12, 2012 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 12, 2012 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 12, 2012 19:47
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 12, 2012 20:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn die Zahlen nicht allzu groß werden, rechne doch einfach mit Integern.
Starfare: Worklog, Website (download)

Sereyanne

BeitragSa, Mai 12, 2012 20:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 12, 2012 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy, denn Gleitkommazahlen haben die angewohnheit, unter gewissen Bedingungen ungenau zu werden.
Starfare: Worklog, Website (download)

ozzi789

BeitragSa, Mai 12, 2012 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Mai 12, 2012 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 13, 2012 14:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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 das Komma durch einen leeren String ersetzen, schon hast Du Cents.

Sereyanne

BeitragSo, Mai 13, 2012 19:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 13, 2012 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 13, 2012 19:51
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Mai 13, 2012 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

BladeRunner

Moderator

BeitragMo, Mai 14, 2012 6:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Sucht einfach im Codearchiv nach "Stringrechner" und ihr findet die Lösung solcher Probleme Wink
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

BeitragMo, Mai 14, 2012 7:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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!!

BladeRunner

Moderator

BeitragMo, Mai 14, 2012 7:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Mai 14, 2012 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink Ich hatte gehofft, es geht schneller.

BladeRunner

Moderator

BeitragMo, Mai 14, 2012 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Die fertigen codes im Archiv sollten eigentlich alle Funktionen zur Verfügung stellen, ohne tagelanges lesen Wink
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

BeitragDi, Mai 15, 2012 7:21
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Mai 17, 2012 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Very Happy
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!!

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic BlitzPlus

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group