Sunday, February 04, 2007

banker's rounding

Ο συνήθης τρόπος στρογγυλοποίησης ποσοτήτων σε Ευρώ, είναι κάτι που ονομάζεται Banker's Rounding, και διαφέρει ελαφρά από τον απλό τρόπο που έχουμε οι περισσότεροι κατά νου για την στρογγυλοποίηση αριθμών με δεκαδικό μέρος.

Η τεχνική που ξέρουμε οι περισσότεροι ("οι περισσότεροι" από εμάς που χρειάζεται να ασχολούμαστε με τέτοια πράγματα) είναι σχετική με το τελευταίο ψηφίο που θέλουμε να διατηρήσουμε. Ας πούμε ότι στρογγυλοποιούμε πάντα στα 2 δεκαδικά. Αν, κατά τους υπολογισμούς μας, μας προκύψει ένας αριθμός όπως ο 17.327 και χρειαστεί να τον στρογγυλοποιήσουμε στα 2 δεκαδικά, το τελευταίο ψηφίο που θέλουμε να διατηρήσουμε (στην περίπτωση μας, το 2) ή θα το αφήσουμε ίδιο (2 δηλαδή) ή θα το αυξήσουμε κατά 1 ανάλογα με το ψηφίο που το ακολουθεί (θα το κάνουμε 3). Ο κανόνας είναι απλός: Αν το επόμενο ψηφίο είναι μέχρι και 4 (0, 1, 2, 3, 4) κρατάμε το ψηφίο μας ίδιο, αν είναι από 5 και πάνω (5, 6, 7, 8, 9) αυξάνουμε το ψηφίο μας κατά ένα (ο συγκεκριμένος αριθμός, ο 17.327 θα γίνει 17.33).

Απ' ότι διαβάζω, το standard για τέτοιους είδους "οικονομικούς" υπολογισμούς (υπολογισμούς που αφορούν χρηματικά ποσά) είναι λίγο διαφορετικό στην Ευρώπη και Αμερική, γιατί η παραπάνω μέθοδος στρογγυλοποίησης έχει την τάση να "μεγαλώνει" ελαφρά τους αριθμούς στο σύνολο τους, μια και τα "μισά" (αριθμοί που καταλήγουν σε .5) είναι πολύ συχνά στα οικονομικά δεδομένα.

Η παραλλαγή της τεχνικής στρογγυλοποίησης που χρησιμοποιείται για χρηματοοικονομικούς υπολογισμούς είναι η εξής: Αν το επόμενο του ψηφίου που θέλουμε να διατηρήσουμε είναι 5, τότε αν το ψηφίο που θέλουμε να διατηρήσουμε είναι ζυγό (άρτιο) τότε το κρατάμε ίδιο, και αν είναι μονό (περιττό) το αυξάνουμε κατά ένα. Αριθμοί όπως ο 17.327 θα στρογγυλοποιηθούν σε 17.33 αλλά ο 17.325 θα στρογγυλοποιηθεί σε 17.32.

Το θέμα είναι ότι ανάλογα με τα εργαλεία που χρησιμοποιεί κανείς για να διαχειριστεί τα οικονομικά του, οι τεχνικές στρογγυλοποίησης που του προσφέρουν είναι διαφορετικές. Οι εντολές (συναρτήσεις) στρογγυλοποίησης του Excel είναι με τον παραδοσιακό τρόπο (βάση του 5) αλλά αρκετές αντίστοιχες συναρτήσεις σε γλώσσες προγραμματισμού και βάσεις δεδομένων κάνουν Banker's Rounding. Γι' αυτό μερικές φορές τα αποτελέσματα μπορεί να διαφέρουν κατά μερικά εκατοστά του Ευρώ.

(Τεχνική σημείωση: η ακριβής περιγραφή της διαδικασίας αναφέρει ακόμη, ότι όταν το επόμενο ψηφίο του αριθμού που θέλουμε να διατηρήσουμε είναι 5, αν το ακολουθούν και άλλα μη-μηδενικά ψηφία, τότε αυξάνουμε το ψηφίο μας κατά ένα. Δηλαδή, ο αριθμός 17.325 θα στρογγυλοποιηθεί σε 17.32 όπως είπαμε, αλλά ο 17.3251 θα στρογγυλοποιηθεί σε 17.33)

4 comments:

Unknown said...

Και για τους προγραμματιστές Delphi που έτυχε να διαβάζουν αυτό το post, ακριβώς έτσι λειτουργεί η Round() του Delphi...

rockordie said...

Στην Delphi υπάρχει και η SimpleRoundTo που κάνει το παλιό καλό round που όλοι ξέραμε.

vpapanik said...

"Αν το επόμενο του ψηφίου που θέλουμε να διατηρήσουμε είναι 5, τότε αν το ψηφίο που θέλουμε να διατηρήσουμε είναι ζυγό (άρτιο) τότε το κρατάμε ίδιο, και αν είναι μονό (περιττό) το αυξάνουμε κατά ένα. Αριθμοί όπως ο 17.327 θα στρογγυλοποιηθούν σε 17.33 αλλά ο 17.325 θα στρογγυλοποιηθεί σε 17.32."

Μήπως μπερδεύει λίγο το παράδειγμα ; Μήπως εννοείς ότι ο αριθμός 17.325 θα στρογγυλοποιηθεί σε 17.32 και ο 17.335 θα στρογγυλοποιηθεί σε 17.34 ; Με λίγα λόγια αν κατάλαβα καλά ο πο#$%# ο τραπεζίτης μοιράζει τα μισά ψηφία ώστε να στρογγυλοποιούνται σε όφελός του και τα άλλα μισά 'υπέρ του πελάτη'. Κωλοτράπεζες !

Το delpi help λέει "If X is exactly halfway between two whole numbers, the result is always the even number. This method of rounding is often called "Banker’s Rounding".

Εγώ την Round() χρησιμοποιώ πάντα, αλλά δεν ήξερα όλη αυτή την ιστορία. Ωραίο post !

vpapanik said...

Δεν είναι ειρωνεία ότι το Delphi έχει Banker's Rounding, ενώ το Excel ΔΕΝ έχει ;;; Ο Bill τρελάθηκε εντελώς...

Respect again για το post !