Formel für Teilung < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 23:00 Do 21.11.2013 | Autor: | Estil |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Hallo,
Ich habe folgende Situation zu bewältigen:
Es gibt eine Funktion in meiner Software die es mir ermöglicht eine bestimmte Menge durch eine beliebige natürliche Zahl zu teilen. Und danach das Resultat dies Operation in die gleiche Anzahl an Zeilen zu kopieren, wie durch die geteilt wurde. Die Menge kann eine beliebige positive Dezimalzahl sein, beinhaltet jedoch nie mehr als 3 Nachkommastellen. Das Resultat der erstellten Zeilen muss wieder die Gesamtmenge ergeben.
Beispiel:
100 / 4 = 25
ergibt: 4 Zeilen mit 25 ergeben 100 insgesamt
Das funktioniert wunderbar bis man z.B. versucht 100 durch 3 zu teilen:
33,3 Periode
33,3 Periode
33,3 Periode
Da die Software "unendlich" nicht verarbeiten kann, ergeben sich nun Differenzen bei der Summierung von 3 x 33,3 Periode. Das System kann die Menge 100 nicht mehr nachvollziehen.
Damit soetwas nicht vorkommt, habe ich mir folgendes überlegt:
Wenn geteilt werden soll, prüft das System erst ob das Resultat eine Dezimalzahl oder eine natürliche Zahl ergibt. Falles das Resultat eine natürliche Zahl ist, berechnet es eine normale Division.
Falls dies nicht der Fall ist, könnte es so (oder so ähnlich) reagieren:
Anhand der angegeben Menge berechnet es die letztmögliche Zahl die ohne Dezimalresultat durch die jeweilige Anzahl geteilt werden kann.
Es teilt diese Menge anschliessend und befüllt die alle folgenden Zeilen mit dem Resultat ausser der Letzten.
Die Menge der letzten Zeile ist also die Menge der vorherigen Zeilen + die anfangs nicht miteinbezogene Restmenge.
Beispiel:
Menge = 100
Teiler = 3
Letztmögliche Zahl < 100 die problemlos geteilt werden kann = 99
=> erste Zeile = 33
=> zweite Zeile = 33
=> dritte Zeile = 34
Problematisch bleiben bei dieser Überlegung nur die Fälle, wo die Menge keine natürliche, sondern eine Dezimalzahl ist und solche, wo der Teiler > Menge.
Mir fehlen die mathematische Weitsicht und Fähigkeiten, eine solche Formel zu erfinden, die all dies berücksichtigt.
Ich wäre sehr dankbar, selbst wenn es sich nur um Hinweise handelt, die mich weiterbringen würden, oder spezielle Dinge die jemand mir empfiehlt, etc.
Vielen Dank jedenfalls im Voraus
Mit freundlichen Grüssen
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 01:10 Fr 22.11.2013 | Autor: | leduart |
Hallo Estil
du kannst alle Zahlen erstmal mit 1000 multiplizieren, dann hast du keine Dezimalzahlen mehr. Am Ende alle Ergebnisse wieder durch 1000 teilen.
evt. ist dann auch das Problem Teiler größer Zahl erreicht.
eigentlich müsste man wissen warum die Summe exakt die Ausgangszahl gibt.
Wozu dient denn das ganze?
Gruss leduart
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 09:37 Fr 22.11.2013 | Autor: | Estil |
Hallo,
vielen Dank! Auch für deine Antwort!
Dein Vorschlag hilft auf jeden Fall bzgl. der Dezimalzahlen die geteilt werden müssen.
Also, das Ganze soll dem Zwecke der Planung dienen.
Du hast zB. einen Auftrag mit 15 Dienstleistungen oder 10mt von irgendeinem Material. Nun soll die Software aber nicht nur "wissen", dass du 10mt im Auftrag hast, sondern auch noch differenzieren, in welchen Zeitperioden diese 10mt benötigt oder rausgehen sollen. Damit ermöglichst du der Software dann nicht nur eine reine Warenmengenplanung, sondern auch ein Cash Flow (Liquidität).
Mit der oben genannten Funktion sollst du also die 10mt auf X Zeiträume aufteilen.
Allerdings sollte halt das ursprüngliche X unverändert bleiben, da dies ja auch buchhalterisch und kontraktuell die richtige Summe ist.
vielen Dank jedenfalls
Wenn noch jemand Ideen hat...
Bis bald
|
|
|
|
|
Hallo!
Hmmm, das klingt eigentlich nach Modulo-Rechnung. Ich weiß nicht, in welcher Sprache du programmierst, aber in C könnte sowas so aussehen:
int menge=100; // davon ausgehend, daß der obige Trick mit der Multiplikation mit 100 verwendet
int teiler=3;
int proLieferung = menge / teiler; // das ist ganzzahdivision: 100/3=33
int rest= menge % teiler; // Das ist der Rest
for(int i=1; i<=teiler; i=i+1){
if(i != teiler){ printf("%d. Lieferung: %d Stück", i, proLieferung); }
else{ printf("%d. Lieferung: %d Stück", i, proLieferung+rest); }
}
Wenn du den Nachkomma-Anteil erst in der letzten Lieferung mitschicken möchtest, könntest du den abtrennen, und später an die letzte Lieferung anfügen:
float dezMenge=100,23;
int menge=(int) dezMenge; // dabei werden die Nachkommastellen automatisch abgeschnitten
float nachkomma=dezMenge-menge;
... weiter wie oben
else{ printf("%d. Lieferung: %f Stück", i, proLieferung+rest+nachkomma); }
...
|
|
|
|