Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 597,21
-
- Posty: 1
- Rejestracja: śr lis 16, 2016 12:43 pm
Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 597,21
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.
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]
Powód: zmiana ikony [attention] na [default]
LibreOffice 5.2 na Windows 7
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Ładny i przydatny problem.
Proponuję zacząć od tabelkiczyli na wynikach
Jak widać, zadanie przypomina kodowanie liczby w systemie pozycyjnym. Tyle, że bardzo szczególnym.
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
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
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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
wystarczy zredukować miejsca po przecinku do 2 miejsc
P.S. nie znałem wcześniej funkcji CZ.CAŁK.DZIELENIA i wystarczyło trochę "pogrzebać" w Calc i zapytać wujka gugla
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
wystarczy zredukować miejsca po przecinku do 2 miejsc
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
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
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Arkusze kalkulacyjne nie są najlepszym środowiskiem do poważnych obliczeń. Bo nie rozróżniają typów danych liczbowych.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
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.
Nie trzeba. Stara wiara używa FLOOR(a/b). // (po polsku chyba ZAOKR.W.DÓŁ -- nie wybacza się takich nazw)Trzeba wykorzystać funkcję:
CZ.CAŁK.DZIELENIA
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)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.
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.
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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ół.
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 223 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.
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.
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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...
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
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Podobny problem jest z wartościami 555,55 lub 555987,32...
OpenOffice 4.1.5 na Windows 10
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.
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)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Obawiam się że się mylisz...
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?
Chodzi Ci o funkcję =LICZBA.CAŁK(y/x)?Jan_J pisze:1. albo mnóż przez 100, licz w groszach, wyniki zaokrąglaj do całkowitych;
Jeżeli 1 tak, to wysypuje się już na kwocie 555,55 czyli 55555 a mogę spróbować znaleźć mniejszą ....Jan_J pisze:15-cyfrowych kwot (w groszach, czyli rzędu 1000000000000 PLN)
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
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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ąć.
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 :
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
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 :
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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(;;)
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 jeżeli 0,00 to nic nie rób
Nieeleganckie ale powinno zadziałać
Spróbuję przeanalizować to o czym piszesz, ale zanim napisałeś wpadłem jeszcze na inne rozwiązanie: KOREKCJĘ funkcją jeżeli(;;)
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 jeżeli 0,00 to nic nie rób
Nieeleganckie ale powinno zadziałać
OpenOffice 4.1.5 na Windows 10
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
OK. Zmyliło mnie końcowe:
(jakby coś jeszcze miało być)Jan_J pisze:Załączam :
OpenOffice 4.1.5 na Windows 10
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.
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 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.
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.
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.
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)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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
Na pozór tak banalny problem...
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
Na pozór tak banalny problem...
OpenOffice 4.1.5 na Windows 10
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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 252 razy
OpenOffice 4.1.5 na Windows 10
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
"uruchomiłem" też Twój plik Jan_J - uzupełniając o nominał Twojego imiennika 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 180 razy
OpenOffice 4.1.5 na Windows 10
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.sypie mi błędami składni
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.zbyt inteligentny
W załączniku także ta druga metoda.
Nie jest banalny. Komputery liczą szybko i powtarzalnie, ale mało dokładnie.na pozór tak banalny problem
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Ja nie o tym. Jak otworzyłem Twój plik to pojawia się Błąd:511: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.
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
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 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
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
We floor? obowiązkowy drugi parametr?NIEBO! pisze:Jak otworzyłem Twój plik to pojawia się Błąd:511:[...]
- brakowało parametru istotność w jednym z typów funkcji
różnica między Libre 5.x (sprawdzałem) a Apache 4.1.x (nie sprawdzałem)?
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.Problemy zaczynają się dopiero na bilionach zł
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Tak, Oo 4.1.x potrzebuje parametru istotność po średniku. z Libre nigdy nie korzystałem, więc się nie wypowiemJan_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)?
https://pl.wikibooks.org/wiki/OpenOffic ... 3%93%C5%81
No nie wiem ... wpisując łopatologicznie:Jan_J pisze:IMO mają prawo się pojawić przy 10^14 zł, tzn. przy setkach bilionów.
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
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.
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.
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.
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
Wprowadziłem już tą poprawkę wyżejJermor pisze:A w kwestii formalnej: 10 lutego 2017 roku wszedł do obiegu banknot 500 złotowy, i co z tym zrobić?
Plik nominaly_2metody.ods uwzględnia Janka "w grze"NIEBO! pisze:"uruchomiłem" też Twój plik Jan_J - uzupełniając o nominał Twojego imiennika na razie działa
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żą?
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
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
...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)
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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.
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.
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.
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.
Re: Funkcja do wydzielenia liczb 100, 50, 20 ... z liczby 59
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)
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
OpenOffice 4.1.3. oraz Libre 4.2.5.2 Windows XP