Zaokrąglenia - algorytm

0

Witam.
Stoję przed takim problemem:
mamy zestaw wierszy (krotek) o atrybutach
CENA RABAT PODATEK CENA_Z_RABATEM ILOSC WARTOSC_NETTO WARTOSC_BRUTTO
Wartości są obliczone następująco:
CENA - liczba z dwiema cyframi po przecinku (np 199.99)
PODATEK = 0.23
RABAT - dowolny współczynnik, np. 0.95
CENA_Z_RABATEM - powstaje przez przemnożenie CENY przez współczynnik RABAT i (uwaga) zaokrąglenie wyniku mnożenia do 2 cyfr po przecinku
ILOSC - całokowita (np. 1,2,3,..,10,.. - nie więcej niż 200)
WARTOSC_NETTO = ILOSC * CENA_Z_RABATEM - (2 miejsca po przecinku, ponieważ WARTOSC_NETTO ma 2msc)
PODATEK_KWOTA = WARTOSC_NETTO * PODATEK (czyli WARTOSC_NETTO * 0.23) uwaga ponowie (drugie zaokrąglenie) zaokrąglone do 2 msc po przec.

Zaokrąglenia są naturalne (0.5 zaokrąglone w górę do jeden)

Zadanie:
Mając dany zbiór wierszy CENA RABAT PODATEK CENA_Z_RABATEM ILOSC WARTOSC_NETTO WARTOSC_BRUTTO
Wykonać możliwe małe - w sensie proporcji "delty" do ceny pierwotnej operacje na kolumnie CENA, aby w wyniku tych modyfikacji:

  1. suma kolumny WARTOSC_NETTO pozostała niezmieniona
  2. suma kolumny WARTOSC_NETTO po przemnożeniu przez PODATEK i zaokrągleniu do 2 msc po przec była sumą kolumny WARTOSC_BRUTTO
    Przykład:

CENA RABAT PODATEK ILOSC CENA_Z_RAB WARTOSC_NETTO PODATEK_KWOTA
2759.00 0.94 0.23 1 2593.46 2593.46 596.50
1740.00 0.94 0.23 1 1635.60 1635.60 376.19

SUMA(WARTOSC_NETTO)=4229.06
SUMA(PODATEK_KWOTA) = 972.69

Tymczasem 4229.06*0.23 = 972,6838, co zaokrąglone do 2 msc = 972,68 (różnica 0.01)
Rozwiązanie (wiersze po zmianie)

2758.99 0.94 0.23 1 2593.45 2593.45 596.49
1740.01 0.94 0.23 1 1635.61 1635.61 376.19
SUMA(WARTOSC_NETTO)=4229.06
SUMA(PODATEK_KWOTA) = 972.68

Poszukuję pomysłów na rozwiązanie tego w ogólnym przypadku.
Za rozwiązanie chętnie odwdzięczę się (np. finansowo)

Poniżej kilka trudniejszych przykładów:
1.
172.44 0.750000 0.230000 1.000000 129.33 129.33 29.75
172.44 0.750000 0.230000 1.000000 129.33 129.33 29.75
131.86 0.750000 0.230000 1.000000 098.90 098.90 22.75
044.26 0.750000 0.230000 1.000000 033.20 033.20 7.64

0737.00 0.900000 0.230000 1.000000 0663.30 0663.30 152.56
0737.00 0.900000 0.230000 1.000000 0663.30 0663.30 152.56
2420.00 0.900000 0.230000 1.000000 2178.00 2178.00 500.94
0309.00 0.900000 0.230000 1.000000 0278.10 0278.10 063.96
0309.00 0.900000 0.230000 1.000000 0278.10 0278.10 063.96
0309.00 0.900000 0.230000 1.000000 0278.10 0278.10 063.96
0309.00 0.900000 0.230000 1.000000 0278.10 0278.10 063.96
0309.00 0.900000 0.230000 1.000000 0278.10 0278.10 063.96
0309.00 0.900000 0.230000 1.000000 0278.10 0278.10 063.96

0968.00 0.900000 0.230000 1.000000 0871.20 0871.20 200.38
1730.00 0.900000 0.230000 1.000000 1557.00 1557.00 358.11
1089.00 0.900000 0.230000 1.000000 0980.10 0980.10 225.42
1032.00 0.900000 0.230000 1.000000 0928.80 0928.80 213.62
0111.00 0.900000 0.230000 2.000000 099.90 0199.80 045.95

Dodam, że nie chodzi o rozwiązanie optymalne, lecz jakiekolwiek sensowne. :-)
Rozwiązanie typu - wpisujemy zera do wszystkich wierszy oprócz ostatniego, a w ostatnim umieszczamy wartość sumy NIE jest sensowne :-)

Pozdrawiam,
Marcin

0
medelski napisał(a):

SUMA(WARTOSC_NETTO)=4229.06
SUMA(PODATEK_KWOTA) = 972.69

Tymczasem 4229.06*0.23 = 972,6838, co zaokrąglone do 2 msc = 972,68 (różnica 0.01)

Jeśli to zadanie jest realne (a nie akademickie) to pytanie co chcesz osiągnąć?

  1. Znaleźć odpowiednie kwoty netto takie które będą pasować do kwoty cąłkowitej którą ktoś Ci zadał odgórnie (typu 2000 zł za pakiet wycieraczek)
  2. Przedstawić podsumowanie do FV - suma brutto.

Przypadek (1) jest bardziej ciekawy, ale przez to mniej prawdopodobny.
Chodzi Ci raczej o (2), czyli przedstawienie podsumowania do FV.

Robi się to zwykle metodą dosyć toporną - nie ma w tym niestety żadnej magii ani algorytmów, po prostu liczysz po kolei:

  • z netto - podatek
  • z podatku i netto - brutto
  • z wszystkich netto - sumę netto
  • z wszystkich brutto - sumę brutto
  • z całego podatku - sumę podatku

Sumę netto możesz wykazać, ale nie wyliczasz z niej ani podatku ani brutto bo to prowadzi do paradoksu który właśnie podałeś.
**Zaokrąglanie nie jest operacją odwracalną. **

1 użytkowników online, w tym zalogowanych: 0, gości: 1