Zaokrąglanie – excelowe dziwactwa i niekonsekwencje

by Marcin

Zaokrąglanie – excelowe dziwactwa i niekonsekwencje

Jednym z „dziwactw” Excela, które może powodować nieco zamieszania, jeżeli się o nim nie wie, jest stosowanie przez program dwóch różnych algorytmów zaokrąglania liczb.

Konsekwencje istnienia „dziwactwa” na rysunku poniżej. Wszystko, co zrobiłem to zaokrągliłem każdą z liczb, a następnie zsumowałem. W pierwszym przypadku (kolumna I) zaokrąglałem przy pomocy excelowskiej funkcji ZAOKR, w drugim (kolumna J) przy wykorzystaniu napisanej w VBA funkcji użytkownika, która jednak nie robi nic innego jak tylko zaokrągla wskazaną liczbę, ale przy użyciu dostępnej z poziomy VBA funkcji Round(). Odpowiedni kod (dla bardzo dociekliwych) poniżej:

Public Function ZAOKR_MOJE(ByVal  liczba As Double, ByVal dokladnosc As Integer) As double
ZAOKR_MOJE = Round(liczba, dokladnosc)
End Function

Zaokrąglanie – excelowe dziwactwa i niekonsekwencje

Jak widzisz na rysunku, wyniki zaokrąglania (oraz sumy) SĄ ZUPEŁNIE RÓŻNE !

Dlaczego ?

W funkcji ZAOKR, dostępnej z poziomu skoroszytu, zastosowano algorytm standardowy, w którym „połówki” (piątki) zaokrąglane są ZAWSZE w górę. Czyli 2,5 zostaje zaokrąglone do 3; 10,345 do 10,35 etc. Jest to dokładnie takie zachowanie, jakiego nauczyliśmy się w szkole i jakiego oczekiwałaby większość z nas.

W przypadku funkcji dostępnych w VBA (oprócz Round() są to także CByte(), CInt(), CLng() oraz CCur()) zastosowano algorytm zwany gaussowskim lub bankierskim. „Połówki” zaokraglane tu są raz w górę, a raz w dół, zawsze do najbliższej liczby parzystej. Dlatego 5,5, tak jak w przypadku funkcji skoroszytowej, zaokrąglone zostanie do 6. Zupełnie jednak inaczej VBA postąpi np. z liczbą 2,5 – zaokraglona ona zostanie do 2, a nie do 3 !

Czy algorytm bankierski jest zły ?

Samo zastosowanie algorytmu bankierskiego nie jest niczym niezwykłym, a tym bardziej złym. W zależności od zastosowań ma on bowiem swoje poważne zalety. Zaokrąglanie standardowe (zawsze w górę) powoduje kumulowanie błędu w przypadku wykonywania późniejszych operacji arytmetycznych na dużych zbiorach danych. Mały przykład poniżej:

Zaokrąglanie – excelowe dziwactwa i niekonsekwencje

Zrobiłem tu dokładnie to samo, co w pierwszym przypadku. Zaokrągliłem każdą z liczb, a następnie zsumowałem. Otrzymane sumy porównałem jednak z sumą, którą bym otrzymał gdybym nie zaokrąglał liczb. Jak widzisz algorytm bankierski zastosowany w VBA sprawia, że otrzymana suma jest o wiele bliższa sumie „oryginalnej”.Wszystko wynika z faktu, że algorytm bankierski, zaokrąglając raz w górę a raz w dół , „amortyzuje” błędy wynikające z zaokrąglania.

Niekonsekwencji ciąg dalszy

Można by się spodziewać, że w Excelu dokonano prostego podziału i funkcje „skoroszytowe” korzystają z jednego algorytmy, a funkcje VBA z drugiego. Byłoby to wciąż dziwne, ale przynajmniej miałoby jakąś wewnętrzną spójność. Niestety programiści Microsoft, z jakiegoś powodu, pozostali bardzo niekonsekwentni i np. w innych funkcjach VBA, takich jak FormatNumber czy Format (w trakcie formatowania liczb przy pomocy tych funkcji, w zależności od wybranego formatu, może także mieć miejsce zaokrąglanie) zastosowali algorytm standardowy.

Dlatego też funkcja VBA Round(2.5, 0) zwróci jako wynik 2, ale już funkcja FormatNumber(2.5, 0) jako wynik zwróci 3. I gdzie tu sens ?

Podsumowanie

Warto o tych różnicach pamiętać przygotowując swoje makra wykonujące operacje zaokrąglania na liczbach. Jak widzisz, wynik zwrócony przez makro może być całkowicie różny od tego jakiego się spodziewasz.

Jak już wspomniałem, nie jest tak, że jeden algorytm jest lepszy od drugiego. Każdy jest dobry w zależności od zastosowania. Algorytm standardowy daje wyniki, których „się spodziewamy”, w przeciwieństwie do algorytmu bankierskiego, który mimo wszystko zaskakuje nieco wynikami.

Szkoda, że te dwa algorytmy zostały zaimplementowane jednocześnie, w dodatku w dosyć chaotyczny sposób. Wydaje mi się, że bylibyśmy bliżej normalności gdyby funkcja VBA Round() zwracała taki sami wynik jak, pełniąca taką sama rolę, funkcja „skoroszytowa” ZAOKR (w angielskiej wersji excela przecież nawet nazywa się ona tak samo – ROUND).

Marcin

Download

{ 33 comments… read them below or add one }

bodek

Nie jestem bankierem ani matematykiem, ale algorytm bankierski polega w skrócie na tym, że jeżeli przed „piatką” jest liczba parzysta (lub zero) to zaokrąglamy liczbę w dół, a jak nieparzysta to w górę. Jest to według mnie o wiele lepszy algorytm, bo statystycznie rzecz ujmując o wiele lepiej się zachowuje przy większej ilości liczb, co sam powyżej udowodniłeś.
W czasach kiedy studiowałem, a jeszcze nie było PC-tów, taki właśnie sposób zaokrąglania obliczeń „inżynierskich” był od nas studentów wymagany.
Podzielam Twoją opinię, że za brak konsekwencji, MS powinien dostać MINUSA.

Marcin

Cześć,

> (…) Jest to według mnie o wiele lepszy algorytm,

Tyle, że otrzymany wynik nie jest tym czego się można spodziewać. Pewien jestem, że większość osób (na pewno moja księgowa) zaokrąglając np. 35,545 do dwóch miejsc po przecinku oczekuje w wyniku 35,55 a nie 35,54. Algorytm bankierski nie jest gorszy (sam twierdzisz, że jest lepszy), jest po prostu bardziej …. niespodziewany 🙂

Wczoraj przeglądałem sobie swoje pierwsze „programy” w VBA i przypomniały mi się moje problemy z aplikacją wystawiająca faktury. Po prostu dawała mi błędne wyniki. Księgowa się wzburzyła, większość faktur musiałem poprawiać, ale najgorsze było to, że przez długi czas nie mogłem dojść do tego – dlaczego. Później, jednym z problemów (nie jedynym) okazało się zaokrąglanie i jego „niespodziewane” wyniki. Stąd właśnie ten tekst 🙂 Warto po prostu z opisanych różnic i niekonsekwencji zdawać sobie sprawę.

W ogóle dzięki Bodek za komentarz. Postaram się w przyszłości dostarczyć Ci więcej tematów skłaniających do podyskutowania.

Marcin

bodek

No cóż, jeżeli weźmiemy pod uwagę nasze intuicyjne oczekiwania, to jako, że 5 leży w „drugiej połówce” liczb od 0 do 9 (czyli 10-ciu cyfr), może się wydawać, że zaokrąglanie w takim przypadku w górę jest prawidłowe lub co najmniej oczekiwane.
Ale my nie mamy 10-ciu cyfr, tylko 9, bo jak mamy na końcu 0, to przecież nie zoakrąglamy.
Zatem
dla liczb 1,2,3,4 – w dół (4 liczby)
dla liczb 6,7,8,9 – w górę (też 4 liczby)
pozostaje 5 – dół/góra?
Przyjmując, że przy 5 zawsze zaokrąglamy w górę, mamy sytuację, w której w 5 na 9 przypadków wystąpienia dowolnej liczby (od 1 do 9) zaokrąglamy „do góry” a w 4 na 9 „na dół” – ewidentne zafałszowanie wyników.
Uwzględniając natomiast parzystość/nieparzystość poprzedzającej 5 liczby (zero traktujemy jako liczbę parzystą), mamy przed piątką juz 10 cyfr, czyli możliwy jest równy podział metod zaokrąglania, czyli statystycznie mamy rozkład 50 na 50%, ponieważ:
dla 0,2,4,6,8 – w dół
dla 1,3,5,7,9 – w górę
czyli 5 na 10 i 5 na 10 przypadków.
Zapewniam, że można się do tego przyzwyczaić i traktować właśnie taka metodę zaokrąglania jako zupełnie naturalną, kwestia przyzwyczajenia.

Odnośnie księgowej – albo miała program zaokrąglający jak Excel na formułach, albo sama robiła to ręcznie metodą „standardową”. Zapewniam natomiast, że jak wylosujesz np: 1000 lub wiecej cyfr z piątką na ostatnim miejscu i zaokrąglisz obiema metodami, to algorytm bankierski zawsze da sumę bliższą rzeczywistej sumie, bo to po prostu statystyka.
pozdrawiam i co złego to nie ja 🙂

bodek

Dopiszę jeszcze uwagę odnośnie zera, napisałem, że „nie zokrąglamy”, to znaczy spotkałem się z dwoma rodzajami zachowań. Niektórzy jak mają 0,5 to obcianją do zera (czyli w dół) inni zokrąglają w górę – w tym drugim przypadku jeszcze bardziej pogłębiają rozrzut i nieprawidłowośc wyników, ponieważ:
dla 1,2,3,4 – w dół (4 liczby)
dla 0,5,6,7,8,9 – w górę (6 liczb)

Marcin

Co by było weselej trzeba pamiętać, że dwa algorytmy zaokrąglania to nie jedyny „problem” na jaki trzeba zwrócić uwagę pracując z liczbami w Excelu.

Spróbuj sobie Bodek wpisać do komórki liczbę 145,145 i następnie zaokrąglić ją do dwóch miejsc po przecinku przy pomocy funkcji VBA (algorytm bankierski). Zaokrągli Ci do 145,15 a nie 145,14 czego byś się spodziewał korzystając z algorytmu bankierskiego.

Tu z kolei dokładność „gubi” się prawdopodobnie gdzieś po drodze, w trakcie konwersji liczby na format binarny „obrabiany” przez komputer. Dodam, że dzieje sie tak kiedy zmienna przekazywana do funkcji VBA zdefiniowana jest jako Double. Kiedy zmienisz sobie na Currency, zaokrągla właściwie do 145,14. Ot – warto być czujnym 🙂

inny bodek

> Ale my nie mamy 10-ciu cyfr, tylko 9, bo jak mamy na końcu 0,
> to przecież nie zoakrąglamy.

zaokraglamy, zaokraglamy
trywialnie – do liczby rownej zaokraglanej

Jasiu

Troche nie rozumiem calego problemu… Moim zdaniem kwestia zaokraglania to tylko kwestia prezentacji danych. Rozumiem, ze kiedys nie bylo komputerow i zaokraglanie bylo potrzebne, bo w istotny sposob skracalo czas potrzebny na zsumowanie wielu liczb. Ale dzis… Dzis komputery sa w stanie zapamietac liczby z dokladnoscia do wielu miejsc po przecinku i dodawac je za nas… Wydaje mi sie w zwiazku z tym, ze najlepsze rozwiazanie to wykonywanie wszystkich operacji na „prawdziwych” liczbach i tylko prezentacja ostatecznych wynikow w zaokraglonej formie.

who

W komencie nr 4 od Bodka jest błąd logiczny:)
„…dla 1,2,3,4 – w dół (4 liczby)
dla 0,5,6,7,8,9 – w górę (6 liczb)”
Te cyfry (1,2, …,9) oznaczają przecież cyfrę po przecinku, przez którą zaokrąglimy w górę (gdy jest to 5-9) lub w dół (1-4), jak po przecinku jest 0 czyli 1,0 to jak możemy to zaokrąglic w górę? 1,0 =2?

Siech

O ile pamiętam jeszcze studia to jest norma na zaokrąglanie i działa ona tak jak algorytm który nazywacie bankierskim – po parzystych w jedną stronę a po nieparzystych w drugą.
Prawdopodobnie zwyczaje bankierskie są oparte właśnie na prawie wynikającym z PN.
Nie sądzę żeby miały osobne źródło w Prawie Bankowym.
Dlatego zaokrąglenia z „5” zawsze w dół są raczej w Polsce „nielegalne”.

bodek

No to się zrobiła dyskusja, faktem jest natomiast, że posty pisałem jeszcze w stanie niedopicia porannej kawy, a admin nie przewidział opcji typu edycja komenta po kliknięciu, zatem jak je teraz czytam, to sam bym sie czepił swojego uzasadnienia.
Zapewniam natomiast, że nie będę umierał za bankierski lub jakiś tam inny algorytm zaokrąglania, a who (kom. 8) ma oczywiście rację, moja poranna nadinterpretacja, sorki:)

Współimiennik

Jasiu skoro tak mówisz podaj mi nazwę komputera który zapamięta dla mnie liczbę Pi bez zaokrąglania jej… :>

mynar

Każdy sposób zaokrąglania jest „legalny” w zależności od zastosowań. Ba czasem zaokrąglenie 1,9 do 1 lub 1,1 do 2 jest również legalne nawet w finansach (vide nasze polskie PITy)

Tybek

Witam!
Ja mam trochę inne pytanie co do tego arkusza. Jak zrobiłeś to, że arkusz kończy się na kolumnie „J” i wierszu nr 26 ??

Marcin

>Jak zrobiłeś to, że arkusz kończy się na kolumnie “J” i wierszu nr 26 ??

Ukryłem pozostałe wiersze i kolumny

Marcin

Keraj

W kolumnach z różnymi formułami powinne być także różne wyniki. Wiersze 9,11,12 zawierają takie same wyniki.

Czy tak powinno być?

Marcin

>W kolumnach z różnymi formułami powinne być także różne wyniki

Niekoniecznie. W niektórych przypadkach zaokrąglanie z poziomy VBA i skoroszytu daje takie same wyniku. Wczytaj się jeszcze raz dokładnie w to co napisałem, a na pewno zrozumiesz. W razie problemów – pisz.

Marcin

Patrycja

Mam problem naczytałam się tego tu troche ale i tak dalej nie iwem co mam zrobic. Problem tkwi w tym: gdy w danej komórce wprowadzam formułę aby liczył przez % i wynik pokazywał do 2 miejsc po przecinku, owszem tak robi ale i tu pojawia się problem zliczając ręcznie poszczególne widoczne kwoty wychodzę na inne.Pojawiają się groszowe sprawy lecz gdy to mni sie kumuluje i takich sum niedokładnych mam dużo wynik odbiega od rzeczywistości. Gdy mam odwołania z jednej zakładki do drugiej i arkuszy błedy cdochodzą nawet do tys. Do tej pory takie kwoty wbijałam z ręki ale ile można?. Ponoć jest jakaś funkcji licz jak widzisz. Jets czy jej nie ma?? Poradzisz coś mi na to?

dona18c

Bardzo ciekawe są Wasze wywody. Dużo można się nauczyć… Ale! Punkt widzenia zależy od punktu siedzenia. W księgowości przyjęta jest zasada, że jeśli coś zaokrąglamy, to od 5 w górę. Już w szkole nas uczulali na to! Chociaż niejednokrotnie chciałoby się inaczej. Jestem pewna, że stąd te niezgodności z księgowością.

Pozdrawiam.

SLY

A co powiecie na zaokrąglenia wielkich liczb w Excelu? Spróbujcie np. dodać do siebie:
1 000 000 000 000 000 000,25 + 1 000 000 000 000 000 000,20. W tym przypadku Excel nie wykona poprawnie prostego dodawania. Czekam na Wasze komentarze.

Zuq

Odpowiadajac Patrycji:
„jest jakaś funkcji licz jak widzisz. Jets czy jej nie ma?? Poradzisz coś mi na to?”

Mozna sprobowac z funkcja zaokr(wartosc;ilosc miejsc po przecinku). Ang odpowiednik to round. Jako wartosc nalezy podac dzielenie jakie wykonujemy aby otrzymac %. W ten sposob Excel „zapomni” o pierwotnym dzieleniu i zapamieta liczbe tylko z iloscia miejsc po przecinku, ktora podamy w funkcji. Dalsze operacje na otrzymanych wynikach powinny byc zgodne z oczekiwaniami tak dlugo jak wyswietlana ilosc miejsc po przecinku bedzie rowna zdefiniowanej w funkcji.

Anka

Witam, tak, czytam te wszystkie komentarze i powiem ze w geodezji obowiazuje zaokraglanie w przypadku piatki zalezne od poprzedzajacej liczby, parzysta/nieparzysta? I doszedl ktos moze do takiej formuły ? Bo włączając opcje systemu bankierskiego (VBA) nie jest to wystarczajace, bo wiele razy sa potrzebne wyniki do 5 miejsc po przecinku. Prosze o komentarze.

Marek

Innymi słowy aby VBA liczył zaokrąglenia standardowo zamiast formuły
a= round(wartość, liczba cyfr) należy zastosować
a = format(wartość, „0.00”) jedyny kłopot to to że to tylko 2 miejsca po przecinku. Jak się do takiej formuły wpisze „0,000” to jóż całkiem wychodzi bzdura.

rob

Szanowne towarzystwo, odnosząc się do metod zaokrąglania, chciałbym uzyskać zaokrąglenie do końcówek 5 lub 9, czyli jaką funkcję VBA zastosować, aby badała liczbę dziesiętną, jeżeli jest z zakresu od 1 do 4 zaokrąglenie odbywało się do 5, z zakresu 6-8 i 0 zaokrąglał do 9, inaczej liczba niech pozostanie bez zmian
Będę niezmiernie wdzięczny za pomoc….

sroka

Pozwolę sobie przypomnieć, że funkcje ARKUSZA Excel są dostępne w VBA za pośrednictwem obiektu Application.WorksheetFunction
W tym przykładzie można było zastosować funkcję:

ZAOKR_MOJE2 = Application.WorksheetFunction.Round(liczba, dokladnosc)

która daje takie same wyniki jak ZAOKR w arkuszu.

Krzysiek

Ja w prostych obliczeniach używam arkusza kalkulacyjnego z pakietu OpenOffice. W tej wersji, którą posiadam (3), arkusz najwyraźniej stosuje algorytm bankowy. Przeprowadziłem mały test – zgodnie z przykładem MARCINA – i otrzymałem sumę 218 (oczywiście korzystając z automatycznej funkcji SUMA). Od lat nie stosuję Excela, ponieważ natknąłem się w nim na ważne błędy. Swego czasu poważna firma konsultingowa opracowała dla naszej biznes plan w excelu. My – na szczęście – przeprowadziliśmy odpowiednie obliczenia niezależnie, znając niektóre słabe punkty tego oprogramowania, i okazało się, że przedsięwzięcie, które według agencji konsultingowej miało być absolutnie dochodowe, przyniosłoby straty. Pamiętam do dzisiaj olbrzymie zdziwienie pracowników tej agencji (chciałbym podkreślić, że według mojej oceny, byli to świetni specjaliści w swej dziedzinie w sensie merytorycznym), kiedy okazało się według naszych wyliczeń bazujących na ich liczbach, wyniki okazały się diametralnie inne. Chciałbym zaznaczyć, że w excelu nie pracuję już co najmniej 6 lat, więc nie podejmuję się oceniania ostatnich wersji tego programu. Tak czy owak, nie na arkusze obliczeniowe chciałbym zwrócić uwagę, ale na algorytmy obowiązujące w naszym systemie, które obowiązują dzisiaj np. w szkole. Dzisiaj dzieci są uczone zaokrąglania w górę od cyfry 5 włącznie, podczas gdy – jak widać – powoduje to powstawanie większych błędów. Ja uczyłem się innego systemu zaokrąglania, w którym ważne było jaka cyfra znajduje się po „5”. Jakie Wy macie doświadczenia ze swoich szkół?

Art

Panowie nie znam się na tym w ogóle. Jak zrobić żeby wprowadzić algorytm bankierski dla licz zaokrąglanych dla np. 8 miejsca po przecinku- gdzie i jaką formułę/ makro zdefiniować. Proszę o odpowiedź

hurgadion

Witam,
bardzo istotne i zaskakujące uwagi 🙂 Pozdrawiam.

Prawy

Nie widzę rozwiązania a jest to bardzo trudna i istotna sprawa.

Pracuje jako architekt i w rozrachunku kosztorysów i przedmiarów związanych z dotacjami unijnymi inwestycji wychodzą takie numery, że aż głowa boli.
W jednym przypadku chodziło o 2 grosze różnicy w sumie kwot.
Nie wiedząc o tych zaokrągleniach excela Posunęliśmy się nawet do tradycyjnego liczenia ( na piechotę ). Masakra.
W dzisiejszej dobie cyfryzacji to musi być rozwiązywalne.

Mariusz

Dużo jest niekonsekwencji zaokrąglania w Excelu, ale można to ogarnąć:

1. ZAOKR(x;precyzja) === VBA Application.Round(x;precyzja) != VBA Round(x;precyzja)

2. Najsensowniej działającą funkcją jest właśnie ZAOKR(x;precyzja):
zaokr(0,119;2) = 0,12 – bezdyskusyjne
zaokr(0,111;2) = 0,11 – bezdyskusyjne
zaokr(0,115;2) = 0,12 – dyskusyjne, ale tak zostało przyjęte
zaokr(0,1149;2) = 0,11 – dyskusyjne, ale wg mnie rozsądne, choć jest jeden przypadek… ale o tym w następnym punkcie.

3. Zaokrąglanie 0,5 w górę do 1 jest kwestią przyjętej zasady, bo jest idealnie w połowie i do niczego mu nie jest bliżej. Natomiast 0,49 nie jest już idealnie w połowie, jest bliżej liczby mniejszej, chyba że…
W przypadku nieskończonej liczby „9”-tek 0,49999(9) mamy niejednoznaczność zapisu dziesiętnego 0,9999(9)=1 (na życzenie mogę przedstawić na to prosty dowód), więc 0,49999(9)=0,5. Oczywiście Excel nie jest w stanie stwierdzić czy tam jest nieskończona liczba „9”-tek, bo typ w jakim reprezentuje tę liczbę jest typem o określonej pojemności, dlatego zakłada bez sprawdzania, że tak nie jest ZAOKR(0,499999999999999;1) = 0,5… no i ja się z tym zgadzam (można sobie wytłumaczyć, że 0,4(9) to jest ta część 0,5, która dla odmiany jest zaokrąglana w dół).

merti

W szkole podstawowej uczono mnie że zaokrągla się wg następującej reguły:
– 0,1,2,3,4 to zaokrąglamy w dół
– 5,6,7,8,9 to zaokrąglamy do góry

Jednak nie mogę się pogodzić z faktem iż excel został od razu skopany przez niepotrzebne zaokrąglanie, np reguła =x*y i przykład =8,00*30,61 daje wynik 244,90 zł, a więc o 2 grosze więcej niż liczy normalny kalkulator.

Czy Excel ma opcję wyłączenia permanentnie zaokrąglania?

Krzysztof

Jak dle mnie to chodzi o to ze liczba nastepujaca po tej ktora mamy zaokrąglic musi byc podwojona i wtedy się rozwiazuje problem. Jesli podwajamy liczbę o ktorej mowa i wychodzi wynik wiekszy lub rowny 10 to powinniśmy zaokrąglic w górę, bo ma „do nie bliżej”. Wiec 3.435 do drugiego miejsca po przecinku zaokraglimy
Do 3.44. Tak na logikę wydaję m7 się. Jak sie myle to poprawcie mnie.

Krzysztof

Wiem ze nie da sie jednoznacznie stwierdzić czy na pewno powinno sie zaokrąglic 5 do góry. Ale zaden podział nie będzie do konca sprawiedliwy i uzasadniony.

Adam

Dzień dobry
A myślałem, że matematyka jako królowa nauk jest nauką ścisłą i nie mozna sobie zaokrąglać jak się komu podoba. Logicznie spodziawa się człowiek racjonalny tylko jednego właściwego sposobu zaokrąglania – tego najbliższego prawdy i najbardziej dokładnego z punktu widzenia systemu dziesiętnego. A swoją drogą gdybym na przykład z powodu przyjęcia przez bank jakiegoś alternatywnego sposobu naliczania odsetek miał więcej o 1000 zł na koncie. Przecież państwo w przepisach powinno stosować jeden sposób naliczania odsetek taki sami w prawie bankowym i podatkowym pow. 0,5 – w górę poniżej 0,5 w dół. Bo przecież gdy raz tak, a raz tak /np w zeznaniu podatkowym/ to już jest sama metoda niespójna w założeniu. I kto na tym zarabia i traci?

Leave a Comment

Previous post:

Next post: