[python] Porovnávání v py 0.2<0.2 True????

Koumes21 koumes21 na gmail.com
Středa Květen 6 18:42:41 CEST 2009


Mám ten pocit, že se doporučovalo při porovnávání dvou čísel použít nějakou odchylku, v tomto případě pravděpodobně nějak takhle:

def float_is_less(a, b, odchylka = 0.0000001):
    return a < (b - odchylka)

Ještě poznámka: problém není s desetinnými čísly v Pythonu ale obecně s desetinnými čísly na počítačích. Základní formát desetinných čísel není "absolutně přesný", protože někdy není možné uložit desetinné číslo úplně přesně kvůli převodu do dvojkové soustavy (může vycházet perioda, kterou počítač musí zaokrouhlit). Pokud člověk potřebuje dostat hodnotu, kterou očekává, je lepší použít celočíselný typ reprezentující např. procenta nebo jiné zlomky celku.

2009/5/6 MICHÁLEK Jan Mgr. <Michalek.Jan na uhul.cz>:
> P.S.:
> Když použiju math.fabs, tak to dělá to samé.
> ________________________________
> From: python-bounces na py.cz [mailto:python-bounces na py.cz] On Behalf Of
> MICHÁLEK Jan Mgr.
> Sent: Wednesday, May 06, 2009 6:28 PM
> To: python na py.cz
> Subject: [python] Porovnávání v py 0.2<0.2 True????
>
> omlouvám se za předchozí prázdný email, omylem jsem to odeslal prázdné
>  
> Řeším následující problém:
> Zpracovávám dotazy z db (MS SQL) a potřebuji vybrat ze dvou čísel to, které
> je bližší k cílové hodnotě,
> v podmínce mám následující výraz
> (abs(fv-tp)<abs(tv-tp))
> fv i tv jsou 0.2, přesto mi to vrací True, fv je suma ze dvou záznamů. tv
> jen z jednoho.
>  
> Pamatuju si, že jsem v nějakém článku našel popis problému s desetinými
> čísly v pythonu a byl tam i popis řešení, ale nemůžu to dohledat.
> když použiju:
> print repr(abs(fv-tp)),repr(abs(tv-tp))
>  
> tak mi to vrátí:
> 0.019999999999999907 0.020000000000000018
>  
> nechci použít zaokrouhlování, co s tím můžu udělat?
>  
> Děkuji Jelen
>  
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 4056 (20090506)
> __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 4056 (20090506)
> __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 4056 (20090506)
> __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>

------------- další část ---------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 260 bytes
Desc: OpenPGP digital signature
URL: <http://www.py.cz/pipermail/python/attachments/20090506/7e67a922/attachment.pgp>


Další informace o konferenci Python