Διαδρομές
/
Python
Python
/
Ύλη
/
Κλάσματα
Κλ

Κλάσματα σε Python

{one: "1 άσκηση", other: "%{count} ασκήσεις"}

Σχετικά με την έννοια Κλάσματα

Το module fractions μας επιτρέπει να δημιουργούμε και να δουλεύουμε με rational numbers: κλάσματα με ακέραιο αριθμητή διαιρεμένο με ακέραιο παρονομαστή.

Για παράδειγμα, μπορούμε να αποθηκεύσουμε το 2/3 ως ακριβές κλάσμα αντί για την κατά προσέγγιση τιμή float 0.6666...

Δημιουργία κλασμάτων

Σε αντίθεση με τους αριθμούς int, float και complex, τα κλάσματα δεν έχουν κάποια literal μορφή. Ωστόσο, ο κατασκευαστής κλασμάτων είναι αρκετά ευέλικτος.

Προφανώς, μπορεί να πάρει δύο ακέραιους αριθμούς. Οι κοινοί παράγοντες απαλείφονται αυτόματα, μετατρέποντας το κλάσμα στην "ανάγωγη μορφή" του (τους μικρότερους ακέραιους που αντιπροσωπεύουν με ακρίβεια το κλάσμα):

>>> from fractions import Fraction

>>> f1 = Fraction(2, 3) # 2/3
>>> f1
Fraction(2, 3)

>>> f2 = Fraction(6, 9)
>>> f2
Fraction(2, 3)  # automatically simplified

>>> f1 == f2
True

Ο κατασκευαστής κλασμάτων μπορεί επίσης να αναλύσει μια αναπαράσταση συμβολοσειράς:

>>> f3 = Fraction('2/3')
>>> f3
Fraction(2, 3)

Μπορεί επίσης να δουλέψει με παραμέτρους float, αλλά αυτό μπορεί να προκαλέσει προβλήματα εξαιτίας του κατά προσέγγιση τρόπου με τον οποίο αναπαρίσταται εσωτερικά η δεκαδική τιμή ως δυαδικός αριθμός. Για περισσότερες πληροφορίες σχετικά με αυτό το ζήτημα αναπαράστασης, δες τον ιστότοπο 0.30000000000000004 και το Αριθμητική κινητής υποδιαστολής: Ζητήματα και περιορισμοί στην τεκμηρίωση της Python.

Για ένα πιο αξιόπιστο αποτέλεσμα όταν χρησιμοποιείς float με κλάσματα, υπάρχει η μέθοδος <fraction>.limit_denominator().

Η .limit_denominator() μπορεί να πάρει μια ακέραια παράμετρο αν έχεις συγκεκριμένες απαιτήσεις, αλλά ακόμη και η προεπιλεγμένη τιμή (max_denominator=1000000) μπορεί να δουλέψει καλά και να δώσει μια αποδεκτή, απλή προσέγγιση.

>>> Fraction(1.2)
Fraction(5404319552844595, 4503599627370496)

>>> Fraction(1.2).limit_denominator()
Fraction(6, 5)

Αριθμητική με κλάσματα

Οι συνήθεις arithmetic operators + - * / ** δουλεύουν με κλάσματα, όπως και με άλλους αριθμητικούς τύπους.

Ακέραιοι και άλλα Fractions μπορούν να συμπεριληφθούν και δίνουν αποτέλεσμα Fraction. Η συμπερίληψη ενός float στην παράσταση έχει ως αποτέλεσμα έξοδο float, με επακόλουθη (πιθανή) απώλεια ακρίβειας.

>>> Fraction(2, 3) + Fraction(1, 4) # addition
Fraction(11, 12)

>>> Fraction(2, 3) * Fraction(6, 5) # multiply fractions
Fraction(4, 5)

>>> Fraction(2, 3) * 6 / 5 # fraction with integers
Fraction(4, 5)

>>> Fraction(2, 3) * 1.2  # fraction with float -> float
0.7999999999999999

>>> Fraction(2, 3) ** 2  # exponentiation with integer
Fraction(4, 9)

Μετατροπές από και προς κλάσματα

Τα κλάσματα είναι εξαιρετικά για τη διατήρηση της ακρίβειας κατά τη διάρκεια ενδιάμεσων υπολογισμών, αλλά μπορεί να μην είναι αυτό που θέλεις για την τελική έξοδο.

Είναι δυνατόν να πάρεις τον αριθμητή και τον παρονομαστή ξεχωριστά ή ως tuple (tuples θα συζητηθούν σε επόμενη έννοια):

>>> Fraction(2, 3).numerator
2
>>> Fraction(2, 3).denominator
3
>>> Fraction(2, 3).as_integer_ratio()
(2, 3)

Διάφορες τυπικές αριθμητικές συναρτήσεις της Python δίνουν επίσης το αποτέλεσμα που θα περίμενες από την εργασία με τύπους int και float:

>>> round(Fraction(11, 3))
4

>>> from math import floor, ceil
>>> floor(Fraction(11, 3))
3
>>> ceil(Fraction(11, 3))
4

>>> float(Fraction(11, 3))
3.6666666666666665
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα