Python zaokruhlovanie na cele cislo nefunguje spravne

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #15 kdy: 19. 02. 2021, 20:51:03 »
V takej situácii nie je normálne v systéme ukladať hodnotu s vysokou presnosťou (trebárs aj 10 desatinných miest), ale pri vyplatený "odrezať tých 0.00neco a čakať až sa pri ďalšom zapísaní úroky preklopý tá hodnota cez 0.01 ? takto nikdy nestratí ani cent ani nedá ani cent navyše. Že v systéme bude hodnota desatinná nemusí znamenať že musí banka vyplatiť desatinné haliere.
Nedovedu si moc představit, jak byste tohle popisoval v obchodních podmínkách. Pořád ale hledáte detaily na konkrétním příkladu, ale neřešíte princip.

Můžeme zkusit jiný příklad. Obyčejná prodejna s potravinami, která má ceny, které mají náhodné rozdělení (tedy žádné psychologické ceny záměrně končící devítkami). Ceny jsou normálně s přesností na halíře. Když se platí v hotovosti, je potřeba cenu nákupu zaokrouhlit na celé koruny. Když se bude zaokrouhlovat matematicky („pětka nahoru“), obchod na zaokrouhlování hotovostních nákupů vydělá. Když se bude pětka zaokrouhlovat na nejbližší sudé číslo, obchod na tom v průměru nevydělá ani neprodělá.

Doufám, že se nedozvím, že dneska každý platí kartou…


Kit

  • *****
  • 707
    • Zobrazit profil
    • E-mail
Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #16 kdy: 20. 02. 2021, 00:02:06 »
V takej situácii nie je normálne v systéme ukladať hodnotu s vysokou presnosťou (trebárs aj 10 desatinných miest), ale pri vyplatený "odrezať tých 0.00neco a čakať až sa pri ďalšom zapísaní úroky preklopý tá hodnota cez 0.01 ? takto nikdy nestratí ani cent ani nedá ani cent navyše. Že v systéme bude hodnota desatinná nemusí znamenať že musí banka vyplatiť desatinné haliere.

Banky nepoužívají float, ale decimal.

Karmelos

  • *****
  • 1 038
    • Zobrazit profil
    • E-mail
Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #17 kdy: 20. 02. 2021, 21:30:21 »
Kterého dementa napadlo, že zaokrouhlených 1.5 se bude rovnat zaokrouhlených 2.5 ?
By mě zajímalo, kdo vymýšlí takovéhle vyfikundace a navíc je nacpe do standardní funkce.
K čemu to vůbec je?
Napadlo to někoho, kdo toho o zaokrouhlování ví víc, než vy. Existuje totiž mnoho způsobů, jak zaokrouhlovat. Tenhle způsob zaokrouhlování vede k menší průměrné chybě, která se zaokrouhlováním vnáší. Ona je totiž pětka jaksi přesně uprostřed intervalu, takže když ji budete zaokrouhlovat stále k větší absolutní hodnotě (tzv. matematické zaokrouhlování, které asi znáte ze ZŠ) a budete mít nerovnoměrně rozložená kladná a záporná čísla (např. budete zaokrouhlovat jenom samé kladné hodnoty), bude vám zaokrouhlování systematicky posouvat výsledek (u kladných čísel nahoru).

Nazývat někoho dementem jenom kvůli vlastní neznalosti je – řekněme hloupé.

Zatímco tohle zaokrouhlování zvýhodní sudá čísla. Prostě posun k dokonalosti.

Krom toho Váš příklad s obchodem pokulhává, při Vaší genialitě byste měl vědět jak se tam správně na ty koruny zaokrouhluje a neplácat tady nesmysly.  Stejně tak se platí i DPH.
Gréta je nejlepší.

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #18 kdy: 20. 02. 2021, 22:11:52 »
Zatímco tohle zaokrouhlování zvýhodní sudá čísla. Prostě posun k dokonalosti.
Což ve většině případů ničemu nevadí, na rozdíl od systematického posunu jedním směrem. Nicméně právě proto existuje více způsobů zaokrouhlování a podle situace se vybere ten, který napáchá nejméně škod.

Krom toho Váš příklad s obchodem pokulhává, při Vaší genialitě byste měl vědět jak se tam správně na ty koruny zaokrouhluje a neplácat tady nesmysly.  Stejně tak se platí i DPH.
V obchodě se (v ČR) pouze při platbě v hotovosti ze zákona zaokrouhluje na nejbližší nominální hodnotu peněz (§ 3 odst. 1 písm. c) zákona č. 634/1992 Sb.). Což opět neřeší případ, kdy se má zaplatit 50 haléřů. Takže tam už záleží na obchodníkovi, zda bude zaokrouhlovat spravedlivě na nejbližší sudé číslo, nebo zda bude zaokrouhlovat ve svůj prospěch na vyšší číslo, nebo ve prospěch zákazníka na nižší číslo.

Že vím, jak se v obchodě v ČR správně zaokrouhluje, nesvědčí o mé genialitě. Nicméně to, že vy to nevíte a na základě chybné domněnky kritizujete někoho jiného, svědčí o vaší hlouposti.

Jinak můj příklad s obchodem byl opět jen příklad na zaokrouhlování. Pokud zaokrouhlování stanoví zákon tak, že povede k systematické chybě, obchodník s tím nic dělat nemůže. To ale není případ ČR, kde zákon právě ten detail, o kterém se celou dobu bavíme, neřeší.

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #19 kdy: 21. 02. 2021, 03:30:16 »
Me fascinuje, jak ani to zatracene zaokrhouhlovani nejde delat jednim zpusobem, a je to slozite.

A zase tady naklusal p Jirsak a... nastala klasicka situace.

Hele. U me automaticky kdyz se rekne zaokrouhlouvat, tak to znamena nahoru. Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly! Zaokrouhlovat se ma az finalni zobrazeni stavu. Neco jako to ma Excel napr.

Tohle je u me standard pocitani s desetinnym cisly.

Chapu pointu te zaokrouhlovaic funcke, ale tu si ma Python puzivat jen interne pro svoje interni potreby. Pro uzivatele je takova funkce jenom matouci.


_Jenda

  • *****
  • 1 601
    • Zobrazit profil
    • https://jenda.hrach.eu/
    • E-mail
Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #20 kdy: 21. 02. 2021, 03:46:53 »
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.
« Poslední změna: 21. 02. 2021, 03:49:46 od _Jenda »

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #21 kdy: 21. 02. 2021, 04:13:21 »
Pokud nechci at se mi posunuje vysledek jednim smerem pri vypoctech, tak sakra himl hergot fix NEZAOKROUHLUJU!!! Pocitam s floaty tak jak vysly!
A to snad není zaokrouhlování? Float má pevně dlouhou mantissu, a výsledky běžně počítaných funkcí (i třeba pouhé sčítání čísel když to zrovna náhodou nevyjde „hezky“) se musí zaokrouhlit, aby šly reprezentovat.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #22 kdy: 21. 02. 2021, 10:11:33 »
Tohle je u me standard pocitani s desetinnym cisly.
Jistě, naučil jste se to v šesté třídě a už jste se pak nikdy nedozvěděl, že to ve skutečnosti může být trochu komplikovanější (jako všechny věci, které se člověk naučil v šesté třídě). Tak pokud půjdete třeba k lékaři, doufejte, že nemá stejný přístup jako vy, že všechno důležité se naučil už v šesté třídě a žádné hlubší znalosti nepotřebuje.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Co jiného asi dělá

Kód: [Vybrat]
print(round(data))
na konci výpočtu, než že to zaokrouhlí výsledek při prezentaci a ne v procesu výpočtu?

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #23 kdy: 21. 02. 2021, 10:29:12 »
Tohle je u me standard pocitani s desetinnym cisly.
Jistě, naučil jste se to v šesté třídě a už jste se pak nikdy nedozvěděl, že to ve skutečnosti může být trochu komplikovanější (jako všechny věci, které se člověk naučil v šesté třídě). Tak pokud půjdete třeba k lékaři, doufejte, že nemá stejný přístup jako vy, že všechno důležité se naučil už v šesté třídě a žádné hlubší znalosti nepotřebuje.

Vsak jo, ale at se zaokrouhli, az kdyz se jdou reprezentovat, a ne v procesu vypoctu.
Co jiného asi dělá

Kód: [Vybrat]
print(round(data))
na konci výpočtu, než že to zaokrouhlí výsledek při prezentaci a ne v procesu výpočtu?

To je tak, ale tak typicka diskuze s vama...

A mozna i v 6 tride jsem si vsiml, ze Excel vzdycky zaokrouhluje zobrazovane hodnoty (5 zaokrhluje nahoru), ale pocita se skutecnyma hodnotama. Touto metodikou k zadnemu posunu vysledku jednim smerem nedochazi.

Nikdy jsem zadny jiny typ zaokrohlovani nepotreboval, a nepotrebuju ho ani ted! Ta funkce round() je shit!

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #24 kdy: 21. 02. 2021, 10:56:35 »
To je tak, ale tak typicka diskuze s vama...
Ano, je. Někdo něco neví, nadává kvůli tomu ostatním. Já to vysvětlím, jak to je doopravdy – načež dotyčný přijde s nějakým novým výmyslem. A pak se přiřítí další neználek na podporu tomu prvnímu a trvá na tom, že jeho znalosti z 6. třídy jsou vrchol vědění a nic podrobnějšího nemůže existovat.

A mozna i v 6 tride jsem si vsiml, ze Excel vzdycky zaokrouhluje zobrazovane hodnoty (5 zaokrhluje nahoru), ale pocita se skutecnyma hodnotama. Touto metodikou k zadnemu posunu vysledku jednim smerem nedochazi.
Excel si také myslí, že rok 1900 byl přestupný. Nebral bych Excel úplně jako etalon matematiky. Mimochodem, Excel umí minimálně 6 způsobů zaokrouhlování – ten, který znáte vy, pak zaokrouhlování od nuly, k nule, zaokrouhlování na liché a zaokrouhlování na sudé (což je přesně to samé, co dělá round() v Pythonu). Šestý způsob je zaokrouhlování na násobky libovolného čísla (třeba 12 nebo 0,25).

K posunu výsledků jedním směrem v tomhle případě samozřejmě dochází. On totiž výsledek nemusí být jenom jeden, jak si představujete. Představte si, že máte v Excelu třeba ceník výrobků, které prodáváte. Pak zjistíte, že je inflace a že se vám zvyšují náklady. Nebudete chtít zjišťovat, co přesně se o kolik zdražilo (ono když se vám zvedne nájemné, plat účetní a cena elektřiny, musíte to stejně nějak rozpočítat mezi všechny výrobky), tak se rozhodnete zdražit vše o inflaci. Takže potřebujete inflací přenásobit každou jednotlivou položku. Když budete zaokrouhlovat tak, jak jste se naučil v 6. třídě, zdražíte celkově víc, než je inflace.

Nikdy jsem zadny jiny typ zaokrohlovani nepotreboval, a nepotrebuju ho ani ted! Ta funkce round() je shit!
Že jste to nikdy nepotřeboval vám nikdo nebere. To ale neznamená, že je nepotřebuje nikdo jiný. To, že funkce round() nezaokrouhluje tak, jak jste se vy naučil v 6. třídě, opravdu není chyba té funkce.

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #25 kdy: 21. 02. 2021, 11:04:10 »
Ta funkce round() je shit!
ta funkce se chova presne tak, jak je popsana v dokumentaci. ze ji nectes nema s Jirsakem nic spolecnyho. Ale chapu ze to pro tebe musi byt zdrojem frustrace a potrebujes si do nekoho kopnout.
Kdyby ses chtel posunout o level nad tu sestou tridu, ktery tohle chovani odpovida, tak mezi dospelejma kdyz neco nevim a nekdo dalsi mi to vysvetli tak mu podekuju, spis nez abych na nej byl nasranej, ze jsem se mylil..

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #26 kdy: 21. 02. 2021, 12:49:37 »

K posunu výsledků jedním směrem v tomhle případě samozřejmě dochází. On totiž výsledek nemusí být jenom jeden, jak si představujete. Představte si, že máte v Excelu třeba ceník výrobků, které prodáváte. Pak zjistíte, že je inflace a že se vám zvyšují náklady. Nebudete chtít zjišťovat, co přesně se o kolik zdražilo (ono když se vám zvedne nájemné, plat účetní a cena elektřiny, musíte to stejně nějak rozpočítat mezi všechny výrobky), tak se rozhodnete zdražit vše o inflaci. Takže potřebujete inflací přenásobit každou jednotlivou položku. Když budete zaokrouhlovat tak, jak jste se naučil v 6. třídě, zdražíte celkově víc, než je inflace.

Tohle je jadro pudla naseho sporu. Nesouhlasim a schvalne to vic rozvedme.

Mam ceni vyrobku v excelu. Tento cenik budu jistojiste mit s presnosti na 1 desetinne misto (desitky haleru). Kdyz budu chtit zvysit ceny o inflaci, tak je zvednu o inflaci, nacez 2. desetinne misto zaokrouhlim klasickou metodou:

10.50,- CZK -> + 3% inflace -> 10.815,- CKZ -> 10.8 CZK

Ukazte mi, v cem je podle vas problem se zaokrohlovanim.

Vy jste totiz strasne komplikovany clovek. Chapete to, ze 99.9% lidi, a dokonce i programatoru, staci bohate klasicky typ zaokrouhlovani, tzn. ten co jsme se vsichni na cele planete naucili v 6. tride?

Ja to chapu, ze existuje vice typu zaokrouhlouvoani, ale sakra, pro 99.9% programatoru je zaokrhlovani to z 6. tridy a zadne dalsi nepotrebujou.

A co me stve je, ze velevazeny Python, ktery si hraje na jazyk radoby jednoduchy a pro zacatecniky, obsahuje ve std lib takovou netradicni a zavadejici metodu zaokrouhlovani. Neni to prvni ani posledni bizarnost se kterou jsem se u Pythonu sektal.

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #27 kdy: 21. 02. 2021, 12:55:17 »
Mozna to chce cist dokumentaci, z https://docs.python.org/3/library/functions.html#round:
Citace
For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2).

Pokud chces standardnejsi chovani, zkus
Kód: [Vybrat]
num_rounded = int(num + 0.5)

Sorry ale tohle prece neni reseni, co kdyz budes chtit zaokrouhlovat na 2 desetinna mista a nikoliv na cela cisla? Reseni co jsi uvedl bude sice delat to co ma, ale codewise je to spatne, spravne ma byt pouzita zaokrouhlovaci funkce.

Jsem nastvany, protoze takovyhle radoby chytrych reseni je co se Pythonu tyce plny STackoverflow, jsou to ustavicna polovicata reseni, ktera zpusobuji akorat neporadek. Ja v Pythonu delam v praci posledni rok a pul, a proste me tenhle pristup dost stve. Za Javy a z C# takovehle bizarnosti vubec neznam.

Java:

Kód: [Vybrat]
double roundOff = Math.round(a * 100.0) / 100.0;

Citace
    /**
     * Returns the closest {@code int} to the argument, with ties
     * rounding to positive infinity.
     *
     * <p>
     * Special cases:
     * <ul><li>If the argument is NaN, the result is 0.
     * <li>If the argument is negative infinity or any value less than or
     * equal to the value of {@code Integer.MIN_VALUE}, the result is
     * equal to the value of {@code Integer.MIN_VALUE}.
     * <li>If the argument is positive infinity or any value greater than or
     * equal to the value of {@code Integer.MAX_VALUE}, the result is
     * equal to the value of {@code Integer.MAX_VALUE}.</ul>
     *
     * @param   a   a floating-point value to be rounded to an integer.
     * @return  the value of the argument rounded to the nearest
     *          {@code int} value.
     * @see     java.lang.Integer#MAX_VALUE
     * @see     java.lang.Integer#MIN_VALUE
     */
    public static int round(float a) {

Asi vyvojari Javy proste pouzili znalosti z 6. tridy a meli by se stydt, nebo ja nevim...
« Poslední změna: 21. 02. 2021, 13:01:13 od registrovany123 »

Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #28 kdy: 21. 02. 2021, 13:11:44 »
Stejnetak C# rounding:

https://docs.microsoft.com/cs-cz/dotnet/api/system.math.round?view=net-5.0#Round1_Example

Nacez C# dokonce i obsahuje variantu, kde si muzu vybrat na kolik desetinnych cislic chci zaokrouhlovat:

Kód: [Vybrat]
public static double Round (double value, int digits);


Re:Python zaokruhlovanie na cele cislo nefunguje spravne
« Odpověď #29 kdy: 21. 02. 2021, 13:18:35 »
Že jste to nikdy nepotřeboval vám nikdo nebere. To ale neznamená, že je nepotřebuje nikdo jiný. To, že funkce round() nezaokrouhluje tak, jak jste se vy naučil v 6. třídě, opravdu není chyba té funkce.

Ne, to opravdu neni chyba te funkce. Ale je to chyba Pythonu a komunity, ze takova zavadejici funkce je pritomna pro zaokrouhlovani.
« Poslední změna: 21. 02. 2021, 13:20:48 od registrovany123 »