Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Datový typ pro práci s penězi

https://en.wikipedia.org/wiki/Decimal_data_type

Decimal ti umozni (v nejakem rozsahu) presne scitat, odcitat a nasobit cisla s desetinymi castmi a prace s penezi byl jeden z duvodu pro jeho vytvoreni. Takze se casto pro praci s penezi doporucuje a mnohdy je to i spravna volba. (A mnohdy taky ne.) A jde pouzit i pro jine vypocty (ale taky ne vzdy je to nejlepsi volba).

Jinak Decimal je v ruznych jazycich implementovan ruzne, take ma ruznou presnost (pocet mist, na ktere je schopen korektne pocitat). Vetsinou jsou vypocty s nim o neco pomalejsi, ale pokud nepracujes s prilis mnoha daty, tak to roli asi hrat nebude - a spatne pouzity algoritmus muze znamenat mnohem horsi vykonnost.

Napriklad Decimal("1") / Decimal("3") se ti ze zjevnych duvodu nikdy nespocte spravne a presne. Navic, pokud si u Decimal zadas pocet desetinych mist (nektere jazyky to vyzaduji), tak ti nebude pocitat presneji - napriklad pro 2 desetina mista (pro pocitani s penezi vetsinou dostacujicici) ti vyjde "0.33" misto 0.33333333333333333333333333 co by ti dal float (cili muzes dostat oproti floatu vysledky i vyrazne nepresnejsi) - a samozrejme na takovehle veci casem narazis, kdy treba nekdo zemre a ma tri dedice, co dedi rovnym dilem, a zrovna nezanecha vhodny pocet korun, tak delis 3 a nekde se to musi zaseknout... A i jazyky, kde pocet desetinych mist nezadavas, tak maji nejaky dany implicitne ve sve implementaci.

Decimal (ani float, ani integer) samy o sobe zadne operace nepodporuji, naopak nektere operace (scitani, nasobeni, deleni ...) nejakym zpusobem podporuji praci s nejakymi typy. A typy, ktere ty operace zrovna nepodporuji se vetsinou zkonvertuji na neco, co ty operace podporuji (i kdyz se pri tom muze ztratit nejaka presnost). Napriklad Decimal asi vetsinou nebude primo podporovan goniometrickymi funkcemi (sinus a podobne) protoze se moc nepocita s tim, ze by se s nimi pouzival a presnost byla nadale nutna presne tim zpusobem, ktery Decimal podporuje.

Pro opravdu narocne vypocty se muze stat, ze budou pouzity zcela jine datove typy (napriklad jsem psal typ, ktery ukladal racionalni cisla jako dvojici jmenovatel a citatel a prubezne je optimalizoval (kratil na zakladni tvar), nebo knihovnu pro presnou praci s cisly na desitky tisic mist, nebo knihovnu pro praci se symboly )

Takze jako u vsech typu je potreba se podivat, co dany typ (v danem jazyce a pri danych knihovnach) umoznuje a co ne a pak podle toho zvolit (s tim, ze casto rozumne vyhovuje i vic ruznych typu) - Decimal je pro nektere operace prima, ale rozhodne to neni stribrna kulka, co resi vsechny problemy.

Taky casto nepotrebujes hodnotu "absolutne presnou" ale jen "rozumne presnou" a i kdyz v prubehu vypoctu pouzivas presnost vyssi, tak vysledek nakonec brutalne zaokrouhlis, aby byl vubec pouzitelny. ("Ne ze bych se chtel srovnavat s radioaktivnim uhlikem ...")

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny