Hoe krijg je een decimaal in de python?

In een echt surrealistische ervaring, heb ik 20 minuten op een taak die ik dacht dat het zou duren 20 seconden.

Ik wil gebruik maken van decimalen, met 3 of meer plaatsen. Ik kan niet alles over 1 plaats, en zelfs in dat geval is het onzin is.

Bijvoorbeeld, ik niet in staat ben om 1/3 te zien als iets anders dan 0 of 0.0.

Googlen bracht me naar een Decimaal getal, maar Decimaal ook mislukt te helpen.

Gelieve een einde maken aan deze marteling en vertel me wat ik moet doen om 1/3 te zien als .333!

Bewerken ik Dank u allen voor het opruimen van dat! Blijkbaar computer wetenschappers hebben uitgevonden iets genaamd deling te verwarren en te irriteren wiskundigen. Bedankt voor je vriendelijk genoeg om te verdwijnen in mijn verwarring.

  • Bedoel je iets als '%.3f' % (1.0/3) is wat je nodig hebt?
  • Python is uniek ten opzichte van veel andere talen in dat u niet moet expliciet verklaren wat voor soort informatie een variabele bevat. (Het is “eend getypt”) In dit geval bij het verdelen van twee gehele getallen, krijg je terug een resultaat dat ook een geheel getal, aka het antwoord naar beneden afgerond. Dit gedrag in de python 2.x was zo vervelend dat ze veranderd in python 3. De oplossing is om altijd voorzichtig te zijn over het declareren van variabelen. Ofwel voorzien van een decimale punt in een nummer te verklaren dat u wilt een niet-geheel getal antwoord (1./3 is voldoende) of expliciet het type wijzigen via float(1)/float(3)
  • Maar om eerlijk te zijn, het is ook leuk om te weten dat het resultaat van een samenwerking tussen twee ints is van hetzelfde type en niet een ander type.
  • Het is geruststellend om te programmeurs, en ik zie een aantal van de rand van de gevallen waar dit gedrag zou nuttig zijn. Maar voor scripting en berekening aanvragen, hoeven de trein gebruikers van het type “1./3.” het is een gigantische hoofdpijn. Het bestaan van het debat is een testament voor de brede acceptatie van python. 🙂
InformationsquelleAutor rschwieb | 2012-07-15



5 Replies
  1. 20

    In Python 2, 1/3 doet deling omdat beide operanden gehele getallen zijn. U hoeft te doen drijven divisie:

    1.0/3.0

    Of:

    from __future__ import division

    Die / doen de werkelijke indeling en // doen deling. Dit is de standaardinstelling van Python 3.

    • // is altijd vloer divisie, zelfs zonder de toekomst te importeren (en, belangrijker, ongeacht het type van de operanden1.0//3 == 0, hoewel Py2 nog steeds geeft het terug als een float).
    • ja, ik weet het, ik was net even te noemen om hem te laten weten dat deling is nog steeds mogelijk, zelfs met from __future__ import division
  2. 7

    Als bij het verdelen van 2 gehele getallen je zult eindigen met een afgekapt integer resultaat (dwz, een fractionele deel van het resultaat wordt genegeerd) dat is de reden waarom

     1 / 3

    geeft u:

     0

    Om dit probleem te voorkomen, ten minste één van de operanden moet een float. bijvoorbeeld, 1.0 /3 of 1 /3.0 of (natuurlijk) 1.0 /3.0 zal voorkomen integer truncation. Dit probleem is niet uniek voor Python door de manier waarop.

    (Bewerken: Zoals in een nuttige reactie hieronder door @Ivc als één van de gehele operanden is negatieve, het resultaat is floor()‘ed in de plaats – zie in dit artikel op de reden voor dit).

    Ook, kan er wat verwarring over de interne en externe represenation van het nummer. Het aantal is wat het is, maar we kan bepalen hoe het wordt weergegeven.

    U kunt de controle van de externe vertegenwoordiging met instructies over het formatteren. Bijvoorbeeld een getal kan worden weergegeven met 5 cijfers achter de decimale punt als dit:

    n = 1/3.0
    
    print '%.5f' %n
    0.33333

    Om 15 cijfers na de komma.

    print '%.15f' %n
    0.333333333333333

    Ten slotte is er een “nieuwe en verbeterde” manier van opmaak snaren/van getallen met behulp van de .format() functie die rond voor waarschijnlijk veel langer dan de %-opmaak heb ik hierboven aangetoond. Een voorbeeld zou kunnen zijn:

    print 'the number is {:.2}'.format(1.0/3.0)

    geven zou je:

    the number is 0.33
    • Ik denk dat je gemist hebt met het feit dat het op was het verdelen van ints
    • oh, ik denk dat ik niet eens te overwegen de interger trunctation om een deel van het probleem, maar het feit dat OP niet meer dan één cijfer na de komma. Bedankt voor het wijzen dit uit, ik zal een notitie toevoegen aan mijn antwoord over truncation.
    • Ik heb eigenlijk niet eens weten hoe het OP was te zien 0.0 om eerlijk te zijn.
    • Ja, dat gooide me uit.
    • Ik had geprobeerd float(1/3), in een vergeefse poging om te stoppen met 1/3 afronding op 0
    • Ah, dat is mijn gok. Het was slechts veranderd in de int resultaat naar een float.
    • Ah .. ja, rechts idee, maar helaas, de niet-zo-juiste volgorde van handelingen 🙂
    • Geconfronteerd met de Lovecraftian maw van de computer van de wetenschap van de logica, ik was bereid om iets te proberen!
    • ha ha .. ik weten, ik heb er zelf ook geweest 🙂
    • Voel je niet slecht, elke programmeur loopt in deze, ongeacht de taal .. zie dit, C programmeurs zijn niet immuun hiervoor. Dezelfde principes zijn van toepassing
    • alleen de nieuwe C-programmeurs zijn gevoelig voor gevallen van gehele getallen delen; de immuniteit opbouwt vrij snel.
    • Waar is dat 🙂 .. als je eenmaal hebt ervaren problemen als gevolg van deze, je de neiging om te onthouden. Re C, ik wil niet eens nadenken over hoe veel uur ik ooit eens als een newbie op if (i = 0) als ik echt bedoeld if (i == 0) .. argh.
    • Deling niet afkappen, het wordt naar beneden afgerond: -1//3 -1 is. Dit verschilt van de C-gedrag, waarbij niet afkappen (-1/3 is 0).
    • Interessant, ik denk dat ik nooit te maken gehad met deze en negatieve getallen. Ik heb altijd gehoord, dat dit bedoeld als “afgekapt”. Ik vond dit. Ik zal een notitie toevoegen aan mijn antwoord – dank (ik leerde ook iets in het proces.

  3. 2

    Uw waarde te worden van een floating point

    In [1]: 1/3
    Out[1]: 0
    
    In [2]: 1/3.0
    Out[2]: 0.33333333333333331

    of

    In [1]: from __future__ import division
    
    In [2]: 1/3
    Out[2]: 0.33333333333333331
  4. 2

    In Python2 geeft u aan ten minste één van de operanden als een floating point getal. Om maar 3 decimalen kunt u gebruik maken van de round() methode:

    >>> a = 1.0 / 3
    >>> round(a, 3)
    0.333

    In Python3 het lijkt ze niet uit te voeren deling standaard, zodat u kunt doen:

    >>> a = 1/3
    >>> round(a, 3)
    0.333
  5. 1

    Gebruik Decimaal. U kunt kreeg 100 cijfers achter de komma.

    from decimal import *
    getcontext().prec = 100
    Decimal(1)/Decimal(3)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *