Prozentrechnung vereinfachen (Genauigkeit)


  • Gesperrt

    Guten Tag,

    ich habe ein kleines JavaScript-Snippet geschrieben, um eine bestimmte Berechnung zu machen, die ich öfters brauche.

    Und zwar geht es darum, dass ein Account von zwei Personen geführt wird, und immer, wenn Person A oder Person B einzahlt bzw. auszahlt, ändert sich natürlich auch der Anteil entsprechend (es gibt also vier Fälle)...

    Zurzeit sieht es so aus:

    <!DOCTYPE html>
    <html lang="de">
      <head>
        <meta charset="utf-8" />
        <title>Ein- und Auszahlung</title>
      </head>
    
      <body>
        <header></header>
        <main>
          Datum:
          <br />
          <input type="datetime-local" id="datum" />
          <br />
          <br />
          Wer?:
          <br />
          <select id="wer">
            <option value="a">Person A</option>
            <option value="b">Person B</option>
          </select>
          <br />
          <br />
          Prozent Person A:
          <br />
          <input type="text" id="prozent_a" value="50.0" />
          <br />
          <br />
          Prozent Person B:
          <br />
          <input type="text" id="prozent_b" value="50.0" />
          <br />
          <br />
          Betrag vorher:
          <br />
          <input type="text" id="vorher" value="100.0" />
          <br />
          <br />
          Betrag nachher:
          <br />
          <input type="text" id="nachher" value="100.0" />
          <br />
          <br />
          <button id="b1">Weiter...</button>
          <br />
          <br />
          <div id="out"></div>
        </main>
        <footer></footer>
        <script>
          document.getElementById("b1").addEventListener("click", function () {
            let datum = document.getElementById("datum").value;
            let wer = document.getElementById("wer").value;
            let prozent_a = parseFloat(document.getElementById("prozent_a").value) / 100;
            let prozent_b = parseFloat(document.getElementById("prozent_b").value) / 100;
            let vorher = parseFloat(document.getElementById("vorher").value);
            let nachher = parseFloat(document.getElementById("nachher").value);
            let out = document.getElementById("out");
            let prozent_a_new;
            let prozent_b_new;
            if (vorher <= nachher) {
              if (wer == "a") {
                prozent_b_new = (vorher * prozent_b) / nachher;
                prozent_a_new = 1 - prozent_b_new;
              } else {
                prozent_a_new = (vorher * prozent_a) / nachher;
                prozent_b_new = 1 - prozent_a_new;
              }
            } else {
              if (wer == "a") {
                prozent_b_new = (vorher * prozent_b) / nachher;
                prozent_a_new = 1 - prozent_b_new;
              } else {
                prozent_a_new = (vorher * prozent_a) / nachher;
                prozent_b_new = 1 - prozent_a_new;
              }
            }
            out.innerHTML = ``;
            out.innerHTML += `Datum: ${datum}<br>`;
            out.innerHTML += `Wer: ${wer.toUpperCase()}<br>`;
            out.innerHTML += `Betrag: ${nachher - vorher} \\$<br>`;
            out.innerHTML += `Vorher: ${vorher} \\$<br>`;
            out.innerHTML += `Nachher: ${nachher} \\$<br>`;
            out.innerHTML += `<br>`;
            out.innerHTML += `Prozent A: ${(prozent_a_new * 100).toFixed(3)} % (Anteil A: ${(nachher * prozent_a_new).toFixed(2)} \\$)<br>`;
            out.innerHTML += `Prozent B: ${(prozent_b_new * 100).toFixed(3)} % (Anteil B: ${(nachher * prozent_b_new).toFixed(2)} \\$)`;
          });
        </script>
      </body>
    </html>
    

    Meine Fragen wären:

    Kann man Zeile 61 bis 77 irgendwie vereinfachen? Und kann vermieden werden, dass in Zeile 64, 67, 72 und 75 immer die Umkehrrechnung verwendet werden muss?

    Edit: Die Backslashes (\\) sind nur dafür, dass ich den Output kopieren und woanders einfügen kann, haben also keine syntaktische Bedeutung.



  • @nameName sagte in Prozentrechnung vereinfachen (Genauigkeit):

    Im if-Zweig und im else-Zweig von if (vorher <= nachher) { (Zeile61) steht dasselbe.
    Also braucht da auch keine Fallunterscheidung sein sein.


  • Gesperrt

    @DirkB

    Stimmt. Ist die sonstige Berechnung denn korrekt?

    Und ich "speichere" immer 3 Nachkommastellen (gerundet)... Es geht jetzt zwar nicht um Millionen Dollar, aber das wird doch irgendwann ungenau? Sprich, ein Nachteil für Person A oder Person B entstünde.



  • @nameName sagte in Prozentrechnung vereinfachen (Genauigkeit):

    Und ich "speichere" immer 3 Nachkommastellen (gerundet)...

    Wenn du nur mit ganzzahligen Beträgen in Cent rechnest, gibt es keine Rundungsfehler.
    Die Prozente werden ja davon abgeleitet.

    Ist die sonstige Berechnung denn korrekt?

    Ich habe keinen Schimmer, was du da überhaupt berechnen möchtest.


  • Gesperrt

    Ich hab mir schon gedacht, dass der Use-Case unvollständig ist...

    Also, es geht um eine "Buchhaltungssoftware" bzw. um ein Haushaltsbuch. Ich möchte den Überblick behalten, was ein- und ausgezahlt wurde. Im Speziellen wird ein Aktiendepot von zwei Personen A und B geführt. Dabei hat jede jederzeit die Möglichkeit, Geld hinzuzufügen oder abzuheben... Allerdings ändert sich ja nach jedem Vorgang das Verhältnis...

    Beispiel:

    Datum: 2024-01-01T12:15
    Wer: A
    Betrag: 0 $
    Vorher: 1000 $
    Nachher: 1000 $

    Prozent A: 50.000 % (Anteil A: 500.00 $)
    Prozent B: 50.000 % (Anteil B: 500.00 $)

    Das ist die Ausgangslage am 1. Januar um 12:15 Uhr. Beide haben gleichviel eingezahlt.

    Jetzt steigt der Depotwert auf 1250 und B möchte 50 auszahlen:

    Datum: 2024-01-03T12:15
    Wer: B
    Betrag: -50 $
    Vorher: 1250 $
    Nachher: 1200 $

    Prozent A: 52.083 % (Anteil A: 625.00 $)
    Prozent B: 47.917 % (Anteil B: 575.00 $)

    Jetzt ist es schon kniffliger. B "hält" nur noch 575 des Depotwerts und A 625.

    Es geht weiter. Der Gesamtwert steigt von 1200 auf 1290, und A möchte 200 einzahlen:

    Datum: 2024-01-05T12:15
    Wer: A
    Betrag: 200 $
    Vorher: 1290 $
    Nachher: 1490 $

    Prozent A: 58.515 % (Anteil A: 871.87 $)
    Prozent B: 41.485 % (Anteil B: 618.13 $)

    Nun hält A schon 871,87 des Gesamtwerts.

    Wie man hier bereits sieht, wird die Berechnung nach einiger Zeit ungenau.

    Ich weiß nicht genau, wie man so etwas richtig "protokolliert"... Ich hatte zwar auch ein Semester Marketing gehört, aber da kam das leider nicht dran.



  • Also ich sehe hier drei Fehler.

    1. Ich fange mal hinten an. Eine Marketing Vorlesung hat mit dem Problem so viel zu tun, wie Java mit Java Script.
      In einem Internet Forum zu schreiben man hätte eine Marketing Vorlesen besucht, führt in keinsterweise dazu, dass man diese Qualifizierung erworben hat.

    Gerade dann, wenn man nicht immatrikuliert ist.

    1. Absolut falscher Ansatz. Die Anwendung ist sagen wir mal suspekt. Die Variablen sind super schlecht benannt. Die Berechnung ist dafür, dass man sich so lange in Informatik Foren tummelt auch für deine Verhältnisse viel zu schlecht.

    Und das rührt daher, dass man noch nie eine richtige Anwendung, geschweige denn eine Multi Tier Application, gebaut hat.

    Es fehlt für die Anforderung eines Haushaltsbuch jegliche Skalierung und einer Persitenz.

    1. Dein Fehler ist, dass du einfach keine Datenstruktur hast. Aus 1) und 2) resultiert eine Gleichung die irgendwas berechnet, um eine Frage in einem Forum stellen zu können.

    Das Korrekte Vorgehen müsste es sein, dass man zunächst ein Depot modelliert. In diesem Depot haben dann teilnehmende eine einen Anteil. Und das Depot hat einen Wert pro Anteil.

    Beim Einzahlen wird man den Anteil erhöhen und zwar mit dem Quotienten der Einzahlung und des Werts des Anteils zum Zeitpunkt der Einzahlung.

    Man kann den Wert des Depots also zum beliebigen Zeitpunkt ändern. Die genauen Werte der teilnehmenden sind dann Produkte der Anzahl der Anteile und dem aktuellen Wert des Depots.

    Diese genauen Werte kann man nun in Prozentuale Werte umrechnen.

    Dadurch gewährleistet man einen skalierbaren Lösungsansatz.

    Viel Spaß beim implementieren.


  • Gesperrt

    Ich kann ja Beiträge weder melden noch negativ bewerten...

    Aber @ Martin: Spar die dein Blabla doch einfach. Wie wär's?

    Oder soll dieser Müll in irgendeiner Art konstruktiv sein?

    Oder noch besser: Wandere doch direkt aus (in dein Heimatland zum Beispiel), ich bin mir sicher, dann hättest du auch ein höheres Einkommen, und es gäbe für alle eine WinWin-Situation. 🙂


  • Gesperrt

    @oxide sagte in Prozentrechnung vereinfachen (Genauigkeit):

    Ich fange mal hinten an. Eine Marketing Vorlesung hat mit dem Problem so viel zu tun, wie Java mit Java Script.

    Ach Mensch, ich hatte darauf ja noch gar nicht reagiert. 😞

    🖕



  • @nameName

    Dein Code offenbart einen grottigen Programmierstil. Das macht es für einen Außenstehenden nicht gerade einfach.

    MFG


  • Gesperrt

    Guten Morgen,

    löscht das Thema bitte, die Frage und vor allem die Antworten haben keinen Mehrwert für irgendwem. Danke



  • Du solltest Dich beim nächsten Mal 'Herpes' nennen, der ist auch lästig, unangenehm und vor allem nicht wegzukriegen.


  • Gesperrt

    Jaja, Unkraut vergeht nur schwerlich. 😉



  • @_ro_ro sagte in Prozentrechnung vereinfachen (Genauigkeit):

    Dein Code offenbart einen grottigen Programmierstil.

    Du meinst, weil nicht 1.000 Klassen für ein einfaches, atomares Problem verwendet wurden?



  • @omggg

    Es wäre gut, wenn du den Thread aufmerksam lesen würdest.

    Ich habe ganz objektiv die Fehler aufgezählt und erläutert.

    Ich wette du tobst gerade vor Wut. Ich schlage dir vor in diesem Fall einfach ein paar Minuten vor die Tür zu gehen.



  • @oxide

    Nein, hast du nicht. Und die angeblichen Verbesserungsvorschläge waren auch falsch.



  • @oxide sagte in Prozentrechnung vereinfachen (Genauigkeit):

    Das Korrekte Vorgehen müsste es sein, dass man zunächst ein Depot modelliert. In diesem Depot haben dann teilnehmende eine einen Anteil. Und das Depot hat einen Wert pro Anteil.

    Du scheinst die Anforderung einfach übergangen zu haben, dass es sich um genau einen Account handelt, der zusammen geführt wird. Aber hey, ändern wir doch einfach die Anforderungen so, wie es uns passt...



  • @omggg

    Du hast, wie immer, mein Post nicht gelesen oder nicht verstanden.

    Ich habe nirgends geschrieben, dass man mehrere Accounts benutzen soll. Es soll nur ein Depot modelliert werden mit zwei verrechnungskonten.

    Kann man auch ohne machen. Denke die grundsätzliche Aussage ist klar.

    Wenn du das nicht schaffst ist ja auch nicht so schlimm. Du trollst erst seit 20 Jahren. Da hat man nicht so viel aufgeschnappt 😆.

    Tief durchatmen hilft da.


Anmelden zum Antworten