Hirdetés

Új hozzászólás Aktív témák

  • kovisoft
    őstag

    Sziasztok,
    egy kezdő Python könyvben volt egy árfolyam átváltó gyakorló feladat. Blender-hez akarok írni egy scriptet, ami a "padlóra" helyezi az objektum alját, ezért néztem bele a programnyelvbe (többek között a Blender scriptnyelve is a Python).

    Gondolom ismeritek...

    # EUR to CAD
    arfolyam_eurtocad = 1.57
    szamlalo = 1
    while (szamlalo < 21):
    cad = arfolyam_eurtocad * szamlalo
    print (szamlalo, " EUR = ", cad, " CAD ")
    szamlalo = szamlalo + 1

    Valamiért nem tud számolni a Python, mert az 1.57-nél az 5.,10, 19. 20. sornál az X milliomodik résznél ad valamennyi értéket a változóhoz.
    Utánanéztem, hogy a round() függvénnyel lehet kerekíteni pl. 2 tizedesjegyig.
    Csak az a baj, hogy nem tud kerekíteni sem. Előfordul, hogy az 5-öt lefelé kerekíti - és két tizedesnél ez 1%.
    Ha 100 millió EUR-t váltok CAD-ra (a példa alapján), akkor buktam 1 millát CAD-ban a Python miatt.
    Azt rebesgetik, hogy komoly scripteket lehet vele írni - biztos van megoldás - csak nem tudom hogyan lehetne kivédeni ezt a kellemetlenséget.

    Ha valakinek van megoldása és megosztja, köszönöm szépen - érdekelne a miértje is...
    Tegnap kezdtem a Pythont - szóval csak bonyolítás nélkül. :)
    Köszi előre is...

    A sokadik tizedesjegynél való eltérés azért adódik, mert amikor nem egész számokkal dolgozik a számítógép, akkor lebegőpontosan tárolja azokat, kettedes tört formájában, és vannak véges tizedes törtek, amik csak végtelen kettedes törtként ábrázolhatóak (hasonlóan ahhoz, mint ahogy az 1/3-ot csak végtelen 0.33333... formájában tudjuk tizedes törtként ábrázolni, harmados törtként meg ez a 0.1), ezért óhatatlanul kerekítve lesznek. Ha egy ilyen végtelen kettedes törtet utána visszaalakítjuk tizedes törtté, akkor lesz ez a pici eltérés a tároláskori kerekítés miatt.

    Ezért szokás a pénzügyi rendszereknél, ahol 1 fillér vagy cent sem térhet el, hogy egész számokkal dolgozunk, pl. mindent fillérben, egész számként tárolunk és számolunk, a számítások eredményét is egészre kerekítjük, kiírásnál pedig a 100-zal való osztás hányadosát és maradékát írjuk ki.

    De én kipróbáltam a programodat egy round() beiktatásával, és nem látom, hogy hol adna rossz eredményt:

    > while (szamlalo < 21):
    ...     cad = round(arfolyam_eurtocad * szamlalo, 2)
    ...     print (szamlalo, " EUR = ", cad, " CAD ")
    ...     szamlalo = szamlalo + 1
    ...
    1  EUR =  1.57  CAD
    2  EUR =  3.14  CAD
    3  EUR =  4.71  CAD
    4  EUR =  6.28  CAD
    5  EUR =  7.85  CAD
    6  EUR =  9.42  CAD
    7  EUR =  10.99  CAD
    8  EUR =  12.56  CAD
    9  EUR =  14.13  CAD
    10  EUR =  15.7  CAD
    11  EUR =  17.27  CAD
    12  EUR =  18.84  CAD
    13  EUR =  20.41  CAD
    14  EUR =  21.98  CAD
    15  EUR =  23.55  CAD
    16  EUR =  25.12  CAD
    17  EUR =  26.69  CAD
    18  EUR =  28.26  CAD
    19  EUR =  29.83  CAD
    20  EUR =  31.4  CAD

Új hozzászólás Aktív témák