![]() |
ROUND Ζητούμενη ακρίβεια στρογγυλοποίηση 1 Συνημμένο(α) καλησπέρα στην υπέροχη κοινότητα , Θα ήθελα βοήθεια στο παρακάτω θέμα στρογγυλοποίησης. Παρόλο που έχει συζητηθεί δεν με καλύπτει στο ζητούμενο . Δηλαδή : Για παράδειγμα, θέλουμε να χρησιμοποιήσουμε 2 δεκαδικά ψηφία και το 402,4249346 να στρογγυλοποιηθεί σε 402,43 . Η χρήση της ROUNDUP μου δίνει το αποτέλεσμα αλλά μεταβάλλει λανθασμένα άλλες εγγραφές. ΠΧ 341,32255 στρογγυλοποιείται σε 341,33 αντί του ορθού 341,42 Επισυνάπτω παράδειγμα βάσης. Ευχαριστώ Γιώργος |
1 Συνημμένο(α) Υπάρχει 1 θέμα "ερμηνείας" Καταρχας ρίξε μια ματιά στο επισυναπτόμενο 1ον ..Μην ονομάζεις τις εφαρμογές χρησιμοποιώντας δεσμευμενες λέξεις...ονομαζόντας την round.accdb...ουσιαστικά ακύρωσες την Round 2ον ... μην κόβεις τα ψηφία στα δεδομένα σου ...αστα όπως τα πέρασες και μετά στην παρουσίαση θα κάνεις το manipulation 3ον .. Δες το ερώτημα για δεις πως με την Round και αναλόγως πως θα κόψεις θα παρεις και το επιθυμητό αποτέλεσμα Τέλος σε όλες τις γλώσσες υπαρχουν προβλήματα "αριθμητικής αναπαράστασης" (δεν θυμάμαι τον όρο) Δηλ το 402,425....στρογγυλλοποιείται σε 402,42 (ΛΑΘΟΣ) αλλά εσωτερικά πρέπει να έχει αποθηκευτεί σαν 402,4249999999 |
Ευχαριστώ Γιάννη, Με τη δεσμευτική ονομασία απορούσα γιατί μου ακύρωνε τη συνάρτηση. Όμως το ζητούμενο είναι η εφαρμογή της λογικής στρογγυλοποίησης δηλαδή το προτελευταίο αριθμητικό ψηφίο αυξάνει κατά 1 εάν το τελευταίο είμαι >4 κ.ο.κ έτσι ώστε στο 402, 425 το 2 πρέπει να γίνει τρία και το 5 να φύγει. καλή σου μέρα |
Να πω την αλήθεια καποιες φορές μου έτυχαν κάποια "λαθάκια" αυτού του τύπου αλλά δεν είχε τύχει ποτέ να ασχοληθώ καθώς δεν με ενοχλούσαν Το κοίταξα όμως και εδώ έχει 2 λύσεις : https://www.techonthenet.com/access/...eric/round.php Μου άρεσε η "πονηρή" λύση του τύπου Κώδικας: Round(YourNumber+0,000001;1)EDIT: το πρόβλημα με την λανθασμένη στρογγυλοποίηση λέγεται Banker Rounding ...: https://stackoverflow.com/questions/...2-instead-of-3 Δες πως επηρεάζεται η ακρίβεια : Κώδικας: ?round(12.650000000000001 ,1) '12 Μηδενικάκαι δες πως πραγματικά αποθηκεύεται ο αριθμός σου: (και η διαφορά Double - Single) https://www.exploringbinary.com/floa...int-converter/ Κώδικας: 12.650000000000001 --> (Double) : 12.6500000000000003552713678800500929355621337890625Κώδικας: 402.4249346 --> (Double) -->402.42493459999997185150277800858020782470703125 |
Καλησπέρα στην παρέα Σε οριακές περιπτώσεις η προσθήκη ενός μικρού αριθμού μπορεί να προκαλέσει λάθος αλλού. Ένα παράδειγμα φαίνεται παρακάτω. x=402.4250000 z=402.4249999 ?round(x,2) 402,42 <-----λάθος (σωστό = 402,43) ?round(z,2) 402,42 <-------σωστό _____________________________ ?round(x+0.000001,2) 402,43 <-----σωστό ?round(z+0.000001,2) 402,43 <------λάθος (μη σωστή επιλογή μικροποσότητας) ----------------------------- ?round(x+0.0000001,2) 402,43 <-----σωστό ?round(z+0.0000001,2) 402,42 <----σωστό Συμπέρασμα Ανάλογα με τα δεδομένα μας, θα πρέπει να κάνουμε κάποιες δοκιμές στην επιλογή της μικροποσότητας, έτσι ώστε να λύνουμε το πρόβλημά μας χωρίς να δημιουργούμε αλλού προβλήματα. |
Ευχαριστώ Γιάννη και Γιώργο |
Γιώργο να είσαι καλά και ελπίζω να καλύφτηκες. |
Καλησπέρα εγώ χρησιμοποιώ αυτόν τον τύπο Round_ok (x,n)= Round(Int(x * (10 ^ n + 1)) / (10 ^ n + 1) + 1 / (10 ^ n + 2), n) ειδικά για 2 δεκαδικά Round_ok (x,2)= Round(Int(x * 1000) / 1000+ 1 / 10000, 2) Φιλικά Δημήτρης |
Καλησπέρα Δημήτρη Συγκρίνοντας το γενικό τύπο με τον τύπο για 2 δεκαδικά νομίζω ότι στο γενικό πρέπει να προστεθούν κάποιες παρενθέσεις. Συγκεκριμένα πιστεύω ότι πρέπει να γίνει: Round_ok (x,2)=Round(Int(x * (10 ^ (n + 1))) / (10 ^ (n + 1)) + 1 / (10 ^ (n + 2)), n) Παρακάτω βλέπουμε μια δοκιμή στο παράθυρο Immediate της VBA x=402.4250000 n=2 ?Round(Int(x * (10 ^ (n + 1))) / (10 ^ (n + 1)) + 1 / (10 ^ (n + 2)), n) 402,43 <---------------------σωστό ?round(x,2) 402,42 <---------------------λάθος |
Παράθεση:
η φιλοσοφία είναι να αφήνω 1 παραπάνω δεκαδικό από όσα θέλω να στρογγυλοποιήσω και να προσθέτω μικροποσότητα και αν το προχωρήσουμε την χρειάζεται μόνο όταν το επόμενο ψηφίο του ψηφίου στρογγυλοποίησης είναι 5 και έπονται μηδενικά δηλ αν Int(x * (10 ^ (n + 1))) Mod 10 = 5 and (x -Int(x * (10 ^ (n + 1))) / (10 ^ (n + 1))) =0 γιατί τότε αν δεν κάνω λάθος δεν δουλεύει σωστά η round στην access Γενικά η Int(x * (10 ^ (n + 1))) / (10 ^ (n + 1)) είναι χρήσιμη να περιορίζουμε τα δεκαδικά ψηφία σίγουρα σε n. Ευχαριστώ |
| Η ώρα είναι 06:29. |
Ms-Office.gr - ©2000 - 2026, Jelsoft Enterprises Ltd.