Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 597,21

Użytkowanie arkusza kalkulacyjnego
Przemek2016
Posty: 1
Rejestracja: śr lis 16, 2016 12:43 pm

Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 597,21

Post autor: Przemek2016 »

Witam

Chciałem z liczb np.:
547,97
21,03
55,00
1,25
199,99
Wydzielić ile jest w tych liczbach liczb 200, 100, 50, 20, 10, 5, 2, 1, 0,50, 0,20, 0,10, 0,05, 0,02, 0,01 i wskazać w ilu sztukach.
Np. 547,97 to: 2 szt. 200, 1 szt. 100, 2 szt. 20, 1 szt. 5, 1 szt. 2, jedna szt. 0,50, 2 szt. 0,20, 1 szt. 0,05, 1 szt. 0,02.

W jaki sposób spowodować podział liczby w taki sposób?
Potrzebuję przygotować specyfikacje do kwot, z częściami 100 sobie poradziłem, ponieważ można liczby dzielić przez 100 i zaokrąglić np. w dół i wyjdą ile sztuk pełnych 100 lub 200 potrzebuję.
Chyba, że jest inny sposób. Proszę o pomoc.
Ostatnio zmieniony ndz gru 18, 2016 12:57 pm przez Jan_J, łącznie zmieniany 2 razy.
Powód: zmiana ikony [attention] na [default]
LibreOffice 5.2 na Windows 7
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

Ładny i przydatny problem.
Proponuję zacząć od tabelki

Kod: Zaznacz cały

                                                                                                  kwota 
200  round(kwota/nominał)     nowa kwota, czyli reszta z tego podziału
100  to samo co wyżej              to samo co wyżej 
50    to samo co wyżej              to samo co wyżej 
20    to samo co wyżej              to samo co wyżej 
itd. aż do otrzymania zera
czyli na wynikach

Kod: Zaznacz cały

                           1122
200    5                   122   
100    1                   22
 50     0                   22
 20     1                   2
 10     0                   2
 5      0                   2
 2      1                   0
 1      0                   0 
Jak widać, zadanie przypomina kodowanie liczby w systemie pozycyjnym. Tyle, że bardzo szczególnym.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Husar
Posty: 203
Rejestracja: śr mar 06, 2013 3:48 am

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Husar »

Ciekawy problem. Trzeba wykorzystać funkcję:

CZ.CAŁK.DZIELENIA

ale generuje błąd w pomocniczej kolumnie (C), bo przy dzieleniu jednej z wartości pojawia się liczba na odległym miejscu po przecinku
Błąd przy korzystaniu z funkcji cz.całk.dzielenia
Błąd przy korzystaniu z funkcji cz.całk.dzielenia
Zrzut ekranu z 2016-11-17 14-49-54.png (12.1 KiB) Przejrzano 6495 razy
Zrzut ekranu z 2016-11-17 15-07-15.png
Zrzut ekranu z 2016-11-17 15-07-15.png (6.92 KiB) Przejrzano 6495 razy
wystarczy zredukować miejsca po przecinku do 2 miejsc
po wykorzystaniu formatowania liczb
po wykorzystaniu formatowania liczb
Zrzut ekranu z 2016-11-17 14-50-34.png (11.46 KiB) Przejrzano 6495 razy

P.S. nie znałem wcześniej funkcji CZ.CAŁK.DZIELENIA i wystarczyło trochę "pogrzebać" w Calc i zapytać wujka gugla
Pozdrawiam
Roman

Daj znać [SOLVED], kiedy Twój problem zostanie rozwiązany
LO 7.2.x/AOO 4.1.x. używane na Ubuntu 20.04LTS i M$ Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

Husar pisze:ale generuje błąd w pomocniczej kolumnie (C), bo przy dzieleniu jednej z wartości pojawia się liczba na odległym miejscu po przecinku
Arkusze kalkulacyjne nie są najlepszym środowiskiem do poważnych obliczeń. Bo nie rozróżniają typów danych liczbowych.
W arkuszu każda liczba ma typ double precision floating point. Stąd brak gwarancji dokładności wyników.
Przydałyby się jeszcze co najmniej dwa typy: dane całkowitoliczbowe i dziesiętne/stałopozycyjne, do finansów właśnie. Oba możemy do pewnego stopnia emulować, wymuszając format prezentacji komórek i włączając opcję [x] Dokładność jak pokazano. Ale niektórych ograniczeń typu double i tak się nie uniknie.
Trzeba wykorzystać funkcję:

CZ.CAŁK.DZIELENIA
Nie trzeba. Stara wiara używa FLOOR(a/b). // (po polsku chyba ZAOKR.W.DÓŁ -- nie wybacza się takich nazw)
Chyba żeby a, b dobrać tak fatalnie, że wynik powinien wyjść całkowity, ale wskutek zaokrągleń wychodzi odrobinę mniejszy, a FLOOR zmniejsza go wtedy o (prawie) 1. I jest źle. Ciekawe, czy CZ.CAŁK.DZIELENIA da wtedy lepszy wynik...

Zaś błąd nie wynika z zaokrąglania do liczby całkowitej przy dzieleniu, tylko z operowania na liczbach dziesiętnych. Póki odejmujemy dane całkowite, jest OK. Ale pamiętajmy, że nie istnieje dokładna komputerowa reprezentacja liczby 0,1 typu double. Tu muszą powstawać błędy, o ile się ich nie maskuje.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jermor »

Może więc warto pomnożyć kwotę przez 100 i działać na odpowiednikach groszy?
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jermor »

Podsyłam rozwiązanie z wykorzystaniem dwóch funkcji: LICZBA.CAŁK i SUMA.ILOCZYNÓW
Aby uniknąć kłopotliwych zaokrągleń, do obliczeń wykorzystałem pomocniczą kolumnę nominałów wyrażonych w groszach.
Formulę z komórki B3 można przekopiować w dół.
Załączniki
nominały.ods
(11.35 KiB) Pobrany 221 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Witajcie!

Jermor dziękuję Ci za Twoje rozwiązanie, bo działa zdecydowanie lepiej niż moje wypociny z testami z wykorzystaniem choćby
=LICZBA.CAŁK()
=CZ.CAŁK.DZIELENIA( )
=MOD()

Jednak po 2 minutach testów klapa, znów się coś rozjechało przy sumowaniu 40 takich rozbitych wartości :) Pewnie znajdzie się tego więcej, ale np dla wartości 310366,91 otrzymujemy sumę 310366,90 (310366,90 i 310366,91 daje taki sam wynik), zatem problem kasjera w O.O. jak dla mnie nadal nie rozwiązany... :(
OpenOffice 4.1.5 na Windows 10
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Podobny problem jest z wartościami 555,55 lub 555987,32...
OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

Problem jest nieodłącznie związany ze sposobem liczenia (dokładniej: z reprezentacją zmiennopozycyjną liczb rzeczywistych) przyjętym w sprzęcie komputerowym.

Są dwa standardowe, dość proste rozwiązania:

1. albo mnóż przez 100, licz w groszach, wyniki zaokrąglaj do całkowitych;
2. albo ustal prezycję wyświetlania kwot na 2 cyfry dziesiętne i włącz w opcjach dokumentu [x] Dokładność jak pokazano.

W obu przypadkach, dopóki nie przekroczysz 15-cyfrowych kwot (w groszach, czyli rzędu 1000000000000 PLN), nie powinno być problemu. Większe kwoty, możliwe tylko teoretycznie, wymagają innych środków zaradczych.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Obawiam się że się mylisz...
Jan_J pisze:1. albo mnóż przez 100, licz w groszach, wyniki zaokrąglaj do całkowitych;
Chodzi Ci o funkcję =LICZBA.CAŁK(y/x)?
Jan_J pisze:15-cyfrowych kwot (w groszach, czyli rzędu 1000000000000 PLN)
Jeżeli 1 tak, to wysypuje się już na kwocie 555,55 czyli 55555 a mogę spróbować znaleźć mniejszą ....
2 minuty później... np:
703
803
903
co ciekawe dla 1003 (10,03zł) 1103 (11,03zł) itd jest już ok
I co z tego że wcześniej się myliłem o 0,03 a teraz mylę się o 3,00. Po podzieleniu jest to samo ...
chyba należałoby na wstępie liczyć na wartościach 100x większych (mogę zaraz spróbować) bo jeżeli operujemy na iloczynie powiększonym 100x to już ten wynik jest obarczony błędem o którym wspominasz.

5 sek później - zgadza się
dla 803 będącego iloczynem 8,03*100 nie działa. Dla 803 działa. wniosek 803 nie jest równe 803

Ja chyba Cię nie rozumiem jak mam to zrobić bo wejściowe są kwoty w ZŁ,GR i nie da się tego przeskoczyć inaczej jak =100*A1, a operowanie na takim iloczynie nic nie zmienia i powoduje wspomniane wcześniej błędy w obliczeniach

Mam załączyć arkusz z którego korzystam?
OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

Nie, sam round(y/x) nie wystarczy. Kluczowym jest zaokrąglenie po odjęciu: round(kwota - nominał* liczba, 2)

Co do skalowania (złote czy grosze) to masz rację. Pisałem z rozpędu, myśląc o konwersji typów danych z double do int. Ale przecież w arkuszach kalkulacyjnych wszystkie liczby są double, więc błędów w wynikach działań nie da się uniknąć.

Kod: Zaznacz cały

nominały		kwota	nominał	liczba
0.01		555.55	=VLOOKUP(C2,A$2:A$15,1)	=FLOOR(C2/D2)
0.02		=ROUND(C2-D2*E2,2)	=VLOOKUP(C3,A$2:A$15,1)	=FLOOR(C3/D3)
0.05		=ROUND(C3-D3*E3,2)	=VLOOKUP(C4,A$2:A$15,1)	=FLOOR(C4/D4)
0.1		=ROUND(C4-D4*E4,2)	=VLOOKUP(C5,A$2:A$15,1)	=FLOOR(C5/D5)
0.2		=ROUND(C5-D5*E5,2)	=VLOOKUP(C6,A$2:A$15,1)	=FLOOR(C6/D6)
0.5		=ROUND(C6-D6*E6,2)	=VLOOKUP(C7,A$2:A$15,1)	=FLOOR(C7/D7)
1		=ROUND(C7-D7*E7,2)	=VLOOKUP(C8,A$2:A$15,1)	=FLOOR(C8/D8)
2		=ROUND(C8-D8*E8,2)	=VLOOKUP(C9,A$2:A$15,1)	=FLOOR(C9/D9)
5		=ROUND(C9-D9*E9,2)	=VLOOKUP(C10,A$2:A$15,1)	=FLOOR(C10/D10)
10		=ROUND(C10-D10*E10,2)	=VLOOKUP(C11,A$2:A$15,1)	=FLOOR(C11/D11)
20		=ROUND(C11-D11*E11,2)	=VLOOKUP(C12,A$2:A$15,1)	=FLOOR(C12/D12)
50		=ROUND(C12-D12*E12,2)	=VLOOKUP(C13,A$2:A$15,1)	=FLOOR(C13/D13)
100		=ROUND(C13-D13*E13,2)	=VLOOKUP(C14,A$2:A$15,1)	=FLOOR(C14/D14)
200				
Nazwy funkcji (nie sprawdzałem, nie mam interfejsu PL pod ręką):
round -> zaokr
vlookup -> wyszukaj.pionowo
floor -> zaokr.w.dół (?)

Więc albo niwelujemy błędy zaokrągleń formułami (trunc, round, floor), albo wymuszając format prezentacji + "dokładność jak pokazano".

Załączam :
nominaly.ods
(10.94 KiB) Pobrany 186 razy
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Brakuje załącznika Jan_J

Spróbuję przeanalizować to o czym piszesz, ale zanim napisałeś wpadłem jeszcze na inne rozwiązanie: KOREKCJĘ funkcją jeżeli(;;) :P
Po rozbiciu pomnożyć przez nominały i sumować jeszcze raz. Jeżeli różnica danej wejściowej i tej otrzymanej będzie 0,01 to na pozycji nominału 0,01 +1 :P jeżeli 0,00 to nic nie rób :)
Nieeleganckie ale powinno zadziałać
OpenOffice 4.1.5 na Windows 10
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

OK. Zmyliło mnie końcowe:
Jan_J pisze:Załączam :
(jakby coś jeszcze miało być)
OpenOffice 4.1.5 na Windows 10
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jermor »

Jak widać nie przeskoczymy zaokrągleń.
Jeśli temat ma zostać praktycznie rozwiązany, to przedstawiam zmodyfikowany sposób.
Zrezygnowałem z mnożenia przez 100, bo do dziesiątków groszy wydaje się, że wszystko działa. Zatem w tym zakresie istota algorytmu się nie zmienia. Ostanie trzy pozycje (grosze) wyznaczam na podstawie tablicy wszystkich możliwych układów monet w zakresie od 0 do 9 groszy. Tę ostatnią cyfrę kwoty pobieram jako tekst i wykorzystuje go w funkcji WYSZUKAJ.PIONOWO. Zastosowałem stała tablicową aby nie umieszczać dodatkowych elementów w arkuszu.
Załączniki
nominały2.ods
(9.58 KiB) Pobrany 183 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

Samo skalowanie x 100 jest bez sensu, o ile nie towarzyszy mu przejście z typu zmiennnopozycyjnego na całkowitoliczbowy. A tego w arkuszu zrobić się nie da.
Dołączyłem mój opisany niezałączony przykład. Sądzę że jest odporny na błędy, bo mimo że jednolicie traktuje wszystkie poziomy nominałów, to dba o usuwanie ew. błędów arytmetyki na każdym z poziomów.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Jan_J - mądrze prawisz i mam nadzieję, że masz rację jednak Twój załącznik sypie mi błędami składni, a ja nie znam dokładnie tych funkcji na których to oparłeś, więc nie do końca mogę szybko przeanalizować i nie wiem jak to pozmieniać, więc na razie odpuściłem, może jeszcze dziś do tego usiądę tymczasem zabrałem się za przykład drugiego Kolegi

Jermor - już miałem Cię okrzyknąć moim Mistrzem, aczkolwiek potem pojawiła się kwota
7 008,20 zł
7 009,20 zł
7 011,20 zl
i potem już znudziło mi się testowanie :)

:crazy:

Na pozór tak banalny problem...
OpenOffice 4.1.5 na Windows 10
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Dołączam mój plik który jest rozwinięciem pliku Kolegi Jermor, który pozwala na "turbo" testy :)
Załączniki
nominaly3.ods
(50.81 KiB) Pobrany 250 razy
OpenOffice 4.1.5 na Windows 10
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

"uruchomiłem" też Twój plik Jan_J - uzupełniając o nominał Twojego imiennika :D na razie działa :) Tylko jest zbyt inteligentny tzn nadgorliwy :) Bo "omija" nominały których nie trzeba użyć. A mi to jest akurat potrzebne :) Ale dziękuję Ci bo dzięki Tobie poznałem funkcje ciut bardziej ambitne :)
Załączniki
nominaly-janJ.ods
(10.45 KiB) Pobrany 178 razy
OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

sypie mi błędami składni
Nie są to błędy składni, tylko błędy wyszukiwania w sytuacji, kiedy wydawanie reszty już zakończono. Czyli w sumie nieistotne. Kwestia minimalizmu; w wersji produkcyjnej można formuły opakować w funkcję postaci jeżeli(czy.błąd(...); ...; ""). W wersji testowej szkoda na to czasu i przy pisaniu, i przy analizie.
zbyt inteligentny
Zamiast wynajdywać lookup-em następny istotny nominał, można by iść po kolei od najwyższego w dół, tworząc ciąg krotności o długości takiej samej, jak ciąg nominałów; być może z zerami.
W załączniku także ta druga metoda.
nominaly_2metody.ods
(12.06 KiB) Pobrany 193 razy
na pozór tak banalny problem
Nie jest banalny. Komputery liczą szybko i powtarzalnie, ale mało dokładnie.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

NIEBO! pisze: sypie mi błędami składni
Jan_J pisze: Nie są to błędy składni, tylko błędy wyszukiwania w sytuacji, kiedy wydawanie reszty już zakończono. Czyli w sumie nieistotne.
Ja nie o tym. Jak otworzyłem Twój plik to pojawia się Błąd:511:

Kod: Zaznacz cały

nominały		kwota	nominał	liczba
0,01		555,55	200	Błąd:511
0,02		Błąd:511	Błąd:511	Błąd:511
0,05		Błąd:511	Błąd:511	Błąd:511
0,1		Błąd:511	Błąd:511	Błąd:511
0,2		Błąd:511	Błąd:511	Błąd:511
0,5		Błąd:511	Błąd:511	Błąd:511
1		Błąd:511	Błąd:511	Błąd:511
2		Błąd:511	Błąd:511	Błąd:511
5		Błąd:511	Błąd:511	Błąd:511
10		Błąd:511	Błąd:511	Błąd:511
20		Błąd:511	Błąd:511	Błąd:511
50		Błąd:511	Błąd:511	Błąd:511
100		Błąd:511	Błąd:511	Błąd:511
200				
Ale przyczyna była trywialna i z nią sobie bez problemu poradziłem - brakowało parametru istotność w jednym z typów funkcji

To samo w tym drugim pliku... ale 2 sek i działa :)

Zabrałem to na "warsztat" potraktowałem kilka razy seriami danych po kilka tysięcy rekordów z zakresu groszy złotówek jak i tysięcy czy miliardów ... nie pomyliło się o grosz! więc :bravo: Problemy zaczynają się dopiero na bilionach zł :)
Problem uznaję za zakończony! :)
Dziękuję koledzy za Wasze zaangażowanie
Pozdrawiam
OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

NIEBO! pisze:Jak otworzyłem Twój plik to pojawia się Błąd:511:[...]
- brakowało parametru istotność w jednym z typów funkcji
We floor? obowiązkowy drugi parametr?
różnica między Libre 5.x (sprawdzałem) a Apache 4.1.x (nie sprawdzałem)?
Problemy zaczynają się dopiero na bilionach zł
IMO mają prawo się pojawić przy 10^14 zł, tzn. przy setkach bilionów. Wtedy przestaje wystarczać cyfr znaczących do reprezentowania kwoty z dokładnością do grosza.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Jan_J pisze:We floor? obowiązkowy drugi parametr?
różnica między Libre 5.x (sprawdzałem) a Apache 4.1.x (nie sprawdzałem)?
Tak, Oo 4.1.x potrzebuje parametru istotność po średniku. z Libre nigdy nie korzystałem, więc się nie wypowiem :)
https://pl.wikibooks.org/wiki/OpenOffic ... 3%93%C5%81
Jan_J pisze:IMO mają prawo się pojawić przy 10^14 zł, tzn. przy setkach bilionów.
No nie wiem ... wpisując łopatologicznie:
1 234 567 891 234,56 zapisuje tą wartość w komórce
gdy przesuniesz przecinek i chcesz zapisać
12 345 678 912 345,67
w komórce zostaje:
12 345 678 912 345,7*

*oczywiście mówię tu znów o O.O.

Nie zmienia to faktu, że jeszcze długo na koncie emerytalnym mi się tyle nie zgromadzi, więc śpię spokojnie :)
OpenOffice 4.1.5 na Windows 10
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jermor »

Dobrze, że napisałem, iż wydaje mi się, że do dziesiątków groszy działa to dobrze.
Bardzo spodobał mi się algorytm @Jan_J.
A w kwestii formalnej: 10 lutego 2017 roku wszedł do obiegu banknot 500 złotowy, i co z tym zrobić? MF twierdzi, że nominał nie będzie wykorzystywany w powszechnym obrocie, ale - odpukać, tfu, tfu - mieliśmy już banknoty milionowe.
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
NIEBO!
Posty: 13
Rejestracja: sob lut 03, 2018 1:13 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: NIEBO! »

Jermor pisze:A w kwestii formalnej: 10 lutego 2017 roku wszedł do obiegu banknot 500 złotowy, i co z tym zrobić?
Wprowadziłem już tą poprawkę wyżej
NIEBO! pisze:"uruchomiłem" też Twój plik Jan_J - uzupełniając o nominał Twojego imiennika :D na razie działa :)
Plik nominaly_2metody.ods uwzględnia Janka "w grze" :)
Ja już używałem kilkukrotnie tych banknotów, więc trafią do powszechnego obiegu prędzej czy później ... a do czego służą? :lol:

Zastosowania:
  • Przyznawanie pieniędzy z programu 500+ za pomocą jednego banknotu;
  • przyznawanie emerytury za pomocą dwóch banknotów;
  • wydawanie pensji za pomocą trzech banknotów;
  • jeszcze większe denerwowanie ekspedientek poprzez płacenie tymi banknotami za kajzerkę czy gumę za 5 gr;
  • kupno róż od cyganki;
  • kupienie sobie 100 bezsensownych upominków w sklepach „Wszystko za 5 zł”;
OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4558
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jan_J »

No nie wiem
...
Mści się niedbalstwo wynikające z pośpiechu i chęci uproszczenia objaśnień.
Liczby double mają ustaloną liczbę binarnych cyfr znaczących (konkretnie 52 -- niech będzie, to też uproszczenie) co przekłada się na 52*log(2) =ok. 15,65 cyfr dziesiętnych. Czyli w praktyce czasem 15, a czasem 16, zależnie od zakresu wartości do którego liczba przynależy. Co z kolei, kiedy rozważamy dane z 2 miejscami ułamkowymi po przecinku daje zakres rzędu 10^13 -- 10^14 jako graniczny. Zgadza się w zasadzie, choć uproszczenia doprowadziły do utraty precyzji wywodu.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2239
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Jermor »

Wracam jeszcze raz do tego wątku.
Chciałbym przedstawić nieco inne podejście do tego zagadnienia. Oparłem je o badanie każdej cyfry rzędu analizowanej wartości. Wykorzystałem trzy zestawy wartości odpowiadających trzem cyfrom 1, 2 i 5 będących początkowymi cyframi dla każdego oficjalnego nominału.
Te ciągi wyglądają dla cyfry 1 tak: 0;1;0;1;0;0;1;0;1;0 dla cyfry 2 tak: 0;0;1;1;2;0;0;1;1;2 a dla 5 tak: 0;0;0;0;0;1;1;1;1;1 i określają ile jednostek nominału jest przypisanych do wartości rzędu. Pierwsza pozycja odpowiada cyfrze 0 w rzędzie.
Jeżeli w jakimś rzędzie wartości wystąpi np cyfra 9 to nie wystąpi wartość nominału 1 (na odpowiedniej pozycji liczonej od 0 jest 0), dwa nominały o początkowej cyfrze 2 (na odpowiadającej pozycji jest 2) i jeden nominał o początkowej cyfrze 5.
Odstępstwo od tej metody pojawia się dopiero dla liczb większych od 999,99, gdyż poczynając od rzędu tysięcy wystarczy ich ilość pomnożyć przez 2. Przykład trochę rozbudowałem umożliwiając podanie maksymalnego nominału 200 albo 500 i w zależności od tego określać ilości banknotów.
Załączam dwa przykłady. W LO mogłem użyć funkcji JEŻELI.BŁAD, której nie ma w Apache OpenOfficce. Nazwy plików określają wydanie Calca.
lo nominały.ods
(13.13 KiB) Pobrany 190 razy
aoo nominały.ods
(12.57 KiB) Pobrany 186 razy
AOO 4.1.15, LO 7.5.9 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Rafkus
Posty: 513
Rejestracja: czw kwie 12, 2018 10:26 pm

Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59

Post autor: Rafkus »

Witam, bardzo ciekawa ta zagwozdka, troszkę myślałem i wymyśliłem 2 proste rozwiązania.
Błąd pojawia się przy obliczaniu nowej pozostałej kwoty, np. mamy kwotę 555,55. Korzystając ze sposobu przedstawionego przez Jana_J otrzymamy wynik:
Nominał / ilość / pozostała kwota / pozostała kwota przedstawiona z kilkunastoma miejscami po przecinku.
200 2 155,55 155,550000000000000000
100 1 55,55 55,550000000000000000
50 1 5,55 5,549999999999950000
5 1 0,55 0,549999999999955000
0,5 1 0,05 0,049999999999954500
0,05 0 0,05 0,049999999999954500
0,02 2 0,01 0,009999999999954520
0,01 0 0,01 0,009999999999954520
Łatwo zauważyć że wydana kwota wynosi tylko 555,54 i czemu ten błąd powstaje.

Rozwiązanie 1: nieznacznie zwiększyć kwotę początkową, wystarczy o 0,001 czyli jako kwotę początkową podać wartość 555,551. Sposób ten nie wyeliminuje rozbieżności w kolumnach pozostała kwota a pozostałą kwotą przedstawioną z kilkunastoma miejscami po przecinku, jednakże będzie podawało poprawną ilość nominałów

Rozwiązanie 2: Wykorzystać funkcję zaokrąglającą do określonej liczby miejsc po przecinku, czyli ZAOKR (liczba; liczba_cyfr).
W tym przypadku liczbą jest wartość pozostałej kwoty zaokrąglona do 2 miejsc po przecinku
ZAOKR (pozostała kwota; 2)
LibreOffice 7.4.6 (preferowany) oraz OpenOffice 4.1.6. Widows 10
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP
ODPOWIEDZ