Python 3 zwevende decimale punten/precisie

Ik lees een tekstbestand met getallen met drijvende komma, allemaal met 1 of 2 decimalen. Ik gebruik float()om een ​​regel om te zetten in een float, en een ValueErrorte verhogen als dat niet lukt. Ik sla alle drijvers op in een lijst. Als ik het uitprint, wil ik het uitprinten als een drijvende komma met 2 cijfers achter de komma.

Stel dat ik een tekstbestand heb met de nummers -3,65, 9,17, 1. Ik lees ze allemaal, en zodra ik ze converteer naar float, voeg ik ze toe aan een lijst. In Python 2 levert het aanroepen van float(-3.65)-3.65op. In Python 3 retourneert float(-3.65) returns-3.6499999999999999` wat zijn precisie verliest.

Ik wil de lijst met floats, [-3.6499999999999999, 9.1699999999999999, 1.0]afdrukken met slechts 2 decimalen. Iets doen in de trant van '%.1f' % round(n, 1)zou een string opleveren. Hoe kan ik een lijst met alle twee decimalen van floats retourneren, en geen strings? Tot dusver heb ik het afgerond met [round(num, 2) for num in list]maar ik zou de decimale punten / precisie moeten instellen in plaats van round().


Antwoord 1, autoriteit 100%

In de opmerkingen staat dat het doel is om af te drukken tot op 2 decimalen.

Er is een eenvoudig antwoord voor Python 3:

>>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'

of gelijkwaardig met f-strings (Python 3.6+):

>>> num = 3.65
>>> f"The number is {num:.2f}"
'The number is 3.65'

Zoals altijd is de float-waarde een benadering:

>>> "{}".format(num)
'3.65'
>>> "{:.10f}".format(num)
'3.6500000000'
>>> "{:.20f}".format(num)
'3.64999999999999991118'

Ik denk dat de meeste use-cases met floats willen werken en dan alleen afdrukkenmet een specifieke precisie.

Degenen die willen dat de nummers zelfworden opgeslagen met een precisie van precies 2 decimalen, raad ik aan de decimaaltype. Meer informatie over de precisie van drijvende komma’svoor geïnteresseerden.


Antwoord 2, autoriteit 74%

De eenvoudige manier om dit te doen is door de round-buit-in te gebruiken.

round(2.6463636263,2)wordt weergegeven als 2.65.


Antwoord 3, autoriteit 38%

Kortom, dat kan niet.

3.65kan niet exact worden weergegeven als een float. Het nummer dat u krijgt, is het nummer dat het dichtst bij 3.65ligt en dat een exacte float-representatie heeft.

Het verschil tussen (oudere?) Python 2 en 3 is puur te wijten aan de standaardopmaak.

Ik zie het volgende zowel in Python 2.7.3 als 3.3.0:

In [1]: 3.65
Out[1]: 3.65
In [2]: '%.20f' % 3.65
Out[2]: '3.64999999999999991118'

Voor een exact decimaal gegevenstype, zie decimal.Decimal.


Antwoord 4, autoriteit 11%

Probeer dit:

num = input("Please input your number: ")
num = float("%0.2f" % (num))
print(num)

Ik geloof dat dit een stuk eenvoudiger is. Gebruik voor 1 decimaal %0.1f. Gebruik voor 2 decimalen %0.2fenzovoort.

Of, als je het allemaal wilt terugbrengen tot 2 regels:

num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)

Antwoord 5, autoriteit 6%

Probeer deze onderstaande functie te begrijpen met python3

def floating_decimals(f_val, dec):
    prc = "{:."+str(dec)+"f}" #first cast decimal as str
    print(prc) #str format output is {:.3f}
    return prc.format(f_val)
print(floating_decimals(50.54187236456456564, 3))

Uitvoer is: 50.542

Ik hoop dat dit je helpt!

Other episodes