Seite 1 von 1

Wie teilt man, sodass eine rationale Zahl rauskommt?

Verfasst: Freitag 10. März 2017, 23:18
von Aries
Hallo, ich möchte einer Variablen einen Bruch zuweisen, und möchte, dass dabei eine rationale Zahl rauskommt.

Es kommen aber ganze Zahlen heraus:

Code: Alles auswählen

>>> x = 1/2
>>> x
0
>>> x = 3/2
>>> x
1
Was mache ich falsch?

Re: Wie teilt man, sodass eine rationale Zahl rauskommt?

Verfasst: Freitag 10. März 2017, 23:30
von kbr
@Aries: Du verwendest Python 2; das ist der Chuck Norris Modus: wenn Chuck Norris teilt, bleibt kein Rest! 8)

Re: Wie teilt man, sodass eine rationale Zahl rauskommt?

Verfasst: Samstag 11. März 2017, 00:44
von BlackJack
@Aries: In Python 2 muss mindestens eine der beiden Zahlen bei der Division eine Gleitkommazahl sein, oder Du machst als ersten Import in dem Modul ``from __future__ import division``.

Re: Wie teilt man, sodass eine rationale Zahl rauskommt?

Verfasst: Samstag 11. März 2017, 09:59
von bwbg
Vorsicht: Gleitkommazahlen sind keine rationalen Zahlen. Für letztere gibt es das Modul fractions.

Re: Wie teilt man, sodass eine rationale Zahl rauskommt?

Verfasst: Donnerstag 23. März 2017, 21:01
von olman
Lege fest wieviel Nachkommastellen du haben willst. Und dann verwende round().

Code: Alles auswählen

>>> x = round(1.0/2,2)
>>> x
0.5
>>> x = round(3.0/2,2)
>>> x
1.5
>>> x = round(1.0/3,2)
>>> x
0.33
>>> x = round(1.0/3,4)
>>> x
0.3333
>>> 

Re: Wie teilt man, sodass eine rationale Zahl rauskommt?

Verfasst: Donnerstag 23. März 2017, 21:26
von BlackJack
@olman: Und das hat jetzt *was* mit der Frage zu tun? Die Frage war ja wie man *überhaupt* Nachkommastellen bekommt, nicht wie man weniger bekommt. Wobei `round()` relativ selten wirklich das ist was die Leute wollen, meistens geht es ja nur um die Anzeige, und das Verhalten von `round()` finden einige Leute auch überraschend die sich um Runden noch nie so wirklich Gedanken gemacht haben:

Code: Alles auswählen

In [16]: [round(0.5 + i) for i in range(10)]
Out[16]: [0, 2, 2, 4, 4, 6, 6, 8, 8, 10]
Zudem darf man wie üblich bei Gleitkommazahlen nicht vergessen das auch `round()` nicht generell die Anzahl der Nachkommastellen begrenzen kann wenn die Zahl nicht exakt als Gleitkommazahl repräsentierbar ist, wie beispielsweise 0.1:

Code: Alles auswählen

In [17]: '%.50f' % 0.1
Out[17]: '0.10000000000000000555111512312578270211815834045410'

In [18]: '%.50f' % round(0.1, 1)
Out[18]: '0.10000000000000000555111512312578270211815834045410'