2014-02-20 4 views
6

Für Abrechnungsprogramm muss ich um 3 einen Preis teilen, so kann esDividing Preise von 3

Zum Beispiel 9 €

  • 3 € ersten Monat
  • 3 € zweiten gemeinsamen mehr als 3 Monaten Monat
  • 3 € dritten Monat

Jetzt würde dieser Preis/3

sein

Aber was ist, wenn die Nummer 10 ist?

  • 3,33 € erster Monat
  • 3,33 € zweiter Monat
  • 3,33 € im letzten Monat

3,33 € * 3 = 9,99 €

One Cent ist verschwunden. Wie kann ich es so machen, dass die Ausgabe 3,33 €, 3,33 €, 3,34 € wird?

+4

Was ist die bevorzugte Ausgabe für die Teilung von $ 0,05? Wäre es (0,01, 0,01, 0,03) oder (0,01, 0,02, 0,02)? – Kevin

+1

Fügen Sie einfach die restlichen € 0,01 zur letzten Rate hinzu – musefan

+3

Dies wäre eine Geschäftsfrage, keine Programmierfrage. Fragen Sie, für wen Sie arbeiten, wie sie damit umgehen wollen. –

Antwort

5

Wie Bathsheba sagte, fragen Sie Ihre Benutzer zuerst.

Hier ist eine Technik, die ich oft in solchen Szenarien verwendet habe. Diese Methode gewährleistet die gleichmäßigste Verteilung mit der Tendenz nach oben zum Ende hin. Wenn Sie beispielsweise DivvyUp(101, 3) aufrufen, erhalten Sie 33.66, 33.67, 33.67. Beachten Sie, dass der Unterschied am Ende nicht nur wettgemacht wird. Stattdessen wird jeder Wert nach dem, was übrig ist, berechnet, nicht was mit dem begonnen wurde.

public static double[] DivvyUp(double total, uint count) 
{ 
    var parts = new double[count]; 
    for (var i = 0; i < count; ++i) 
    { 
     var part = Math.Truncate((100d * total)/(count - i))/100d; 
     parts[i] = part; 
     total -= part; 
    } 
    return parts; 
} 
+0

Haben Sie zufällig eine Idee, wie Sie Math.Truncate in PHP übersetzen? (Ich brauche es auch dort, ich habe den Rest übersetzt, aber finde keine Abkürzung) – Boyen

+0

Probieren Sie 'round' mit dem' PHP_ROUND_HALF_DOWN' Modus aus. –

+0

Docs dafür: http://php.net/round –

11

Sie könnten den letzten Wert einstellen, indem Sie die Differenz berechnen, anstatt über die gleiche Berechnung wie der Rest. In Pseudo-Code:

normalMonthPrice = RoundToTwoPlaces(totalPrice/months); 
lastMonthPrice = totalPrice - (normalMonthPrice * (months - 1)); 
+0

Genie! Vielen Dank! – Boyen

3

Herzlichen Glückwunsch, Sie haben herausgefunden, warum die Computerwelt als „setzt Mathematik auf es“ nicht so einfach ist -

Die einfachste Lösung wäre, um 3 zu teilen, rund um zwei Dezimalstellen, und verwenden Sie diesen Wert für die ersten beiden Monate und original - 2 * perMonth für den Rest.

15

Sie müssen den Buchhalter fragen, was sie hier wollen. Das ist eine wichtige Aufgabe in der Softwareentwicklung: Fragen Sie die Benutzer.

Normalerweise würden Sie aus Stabilitätsgründen die von einem Saldokonto gezahlten Beträge abziehen und Überprüfungen vornehmen, um sicherzustellen, dass der Saldo auf Null fällt.

Und nicht jemals Verwenden Sie einen Fließkomma-Datentyp beim Erstellen von Buchhaltungssoftware. Fließkomma-Präzision wird Sie beißen. Verwenden Sie stattdessen einen Währungstyp.

+4

Diese Antwort kann nicht genug aufgeräumt werden. Buchhalter haben ihre Möglichkeiten, diese Probleme zu lösen, Sie müssen dies berücksichtigen. Sie werden keine andere Lösung mögen (sie kennen auch die verwandten Gesetze). – Luaan

+0

+1, nachdem Sie mit ein paar verschiedenen Buchhaltungspaketen geschrieben haben, hängt es von der Software und den Benutzern ab, für die Sie arbeiten. Rundungsmethoden in einem Buchhaltungspaket können fremdartig sein und in anderen einfach falsch sein. – mdm

+0

Der Benutzer sagte, er wollte es in 3,33,3,33,3,34 gemacht werden. So funktionieren die anderen Lösungen perfekt – Boyen