Web-Anwendung, die in PHP mit einer MySQL-Datenbank kodiert ist.
Ich habe ein System, das verschiedene Kosten für eine Anzahl von Leuten berechnet, wenn man Kosten aufteilt. Beispiel: Person A kauft etwas für 10 und Personen B, C und D teilen die Kosten.
Das System sollte daher eine positive Aufzeichnung für Person A von 10 und negative Aufzeichnungen von 10/3 für B, C und D registrieren.
Allerdings, wenn dies erledigt ist; B, C und D haben nach der Rundung -3,33. Was natürlich nicht zu den insgesamt 10 addiert. Was ist der beste Weg, um dieses Problem zu lösen? Eine optimale Lösung wäre Randomise, welche Person die etwas größeren Kosten auch bekommen.
Eine mögliche Lösung ist, wenn ich nur die Schulden der letzten Person 10 - (A + B)
habe, aber dann gibt es ein Problem, wenn vier Personen Kosten von zum Beispiel 13.34 teilen. Die verschiedenen Teile wären dann 3,34, 3,34, 3,34 und 3,32, während die optimale Aufteilung 3,34, 3,34, 3,33, 3,33 wäre.
Manche mögen argumentieren, dass dies mit ausreichenden Dezimalstellen nur ein Problem ist, wenn große Mengen an Zeilen vorhanden sind. Aber in einem wirtschaftlichen System denke ich, dass es von Anfang an wichtig ist, ein ausfallsicheres System zu haben. Es muss skalierbar sein und darf nicht den geringsten Fehler enthalten. Unfairness ist in Ordnung, nur keine Fehler.
Ähnliches Problem: summe dividierte Werte Problem (Umgang mit Rundungsfehler)
Das scheint zu funktionieren - Ссылка .
Verwendet jQuery als Beispiel, aber wenn Sie PHP kennen, sollten Sie es leicht in PHP konvertieren können. Wenn du auch PHP Code brauchst, sag es mir, ich werde es für dich schreiben.
Ich werde den Code hier auch einfügen -
%Vor%BEARBEITEN:
Und hier funktioniert PHP-Code -
%Vor%EDIT 2:
Dies sollte das js-Problem beheben - Ссылка aktualisierten Code oben auch.
EDIT 3:
Bearbeiteter PHP-Code und JS-Code, so dass er für alle Beispiele funktioniert - Ссылка .
Vielleicht machen Sie eine neue "Rundungsbilanz" für jeden Benutzer. Wenn es 10 auf drei Arten geteilt werden würde, würde jeder Benutzer 3,34 bezahlen. Jeder Benutzer würde auch 2/3 eines Cent zu ihrem Rundungssaldo haben. (Dies müsste als Text gespeichert werden, nehme ich an).
Wenn das nächste Mal das gleiche passiert, überprüfe das Rundungsguthaben. Sie haben 2/3 Cent, also kannst du jetzt ein Drittel ausnehmen (also haben sie jetzt 1/3 Cent in der Rundungsbilanz) und nur 3.33 berechnen.
Tags und Links php divide rounding-error