Θέλω το "α" να στρογγυλοποιηθεί σε 13,95.
>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999
Η συνάρτηση `round
δεν λειτουργεί όπως περίμενα.
Αντιμετωπίζετε το παλιό πρόβλημα με τους αριθμούς κινητής υποδιαστολής ότι δεν μπορούν να αναπαρασταθούν ακριβώς όλοι οι αριθμοί. Η γραμμή εντολών απλώς σας δείχνει την πλήρη μορφή κινητής υποδιαστολής από τη μνήμη.
Με την αναπαράσταση κινητής υποδιαστολής, η στρογγυλοποιημένη εκδοχή σας είναι ο ίδιος αριθμός. Δεδομένου ότι οι υπολογιστές είναι δυαδικοί, αποθηκεύουν τους αριθμούς κινητής υποδιαστολής ως ακέραιο αριθμό και στη συνέχεια τον διαιρούν με μια δύναμη του δύο, οπότε το 13,95 θα αναπαρασταθεί με παρόμοιο τρόπο όπως το 125650429603636838/(2**53).
Οι αριθμοί διπλής ακρίβειας έχουν 53 bit (16 ψηφία) ακρίβειας και οι κανονικοί κινητοί αριθμοί έχουν 24 bit (8 ψηφία) ακρίβειας. Ο τύπος κινητής υποδιαστολής στην Python χρησιμοποιεί διπλή ακρίβεια για την αποθήκευση των τιμών.
Για παράδειγμα,
>>> 125650429603636838/(2**53)
13.949999999999999
>>> 234042163/(2**24)
13.949999988079071
>>> a=13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a,2))
13.95
>>> print("{0:.2f}".format(a))
13.95
>>> print("{0:.2f}".format(round(a,2)))
13.95
>>> print("{0:.15f}".format(round(a,2)))
13.949999999999999
Αν θέλετε μόνο δύο δεκαδικά ψηφία (για παράδειγμα, για να εμφανίσετε μια νομισματική τιμή), τότε έχετε μερικές καλύτερες επιλογές:
Μπορείτε να τροποποιήσετε τη μορφή εξόδου:
>>> a = 13.95
>>> a
13.949999999999999
>>> print "%.2f" % a
13.95
Κάνει ακριβώς αυτό που του είπατε να κάνει και λειτουργεί σωστά. Διαβάστε περισσότερα σχετικά με τη σύγχυση κινητής υποδιαστολής και ίσως δοκιμάστε αντί αυτού τα δεκαδικά αντικείμενα.