Forum

Forum (https://www.ms-office.gr/forum/)
-   Access - Ερωτήσεις / Απαντήσεις (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/)
-   -   ROUND Ζητούμενη ακρίβεια στρογγυλοποίηση (https://www.ms-office.gr/forum/access-erotiseis-apantiseis/6055-round-zitoimeni-akribeia-stroggylopoiisi.html)

mousatos 16-02-22 20:00

ROUND Ζητούμενη ακρίβεια στρογγυλοποίηση
 
1 Συνημμένο(α)
καλησπέρα στην υπέροχη κοινότητα ,
Θα ήθελα βοήθεια στο παρακάτω θέμα στρογγυλοποίησης. Παρόλο που έχει συζητηθεί δεν με καλύπτει στο ζητούμενο . Δηλαδή :
Για παράδειγμα, θέλουμε να χρησιμοποιήσουμε 2 δεκαδικά ψηφία και το 402,4249346
να στρογγυλοποιηθεί σε 402,43 . Η χρήση της ROUNDUP μου δίνει το αποτέλεσμα αλλά μεταβάλλει λανθασμένα άλλες εγγραφές. ΠΧ 341,32255 στρογγυλοποιείται σε 341,33 αντί του ορθού 341,42 Επισυνάπτω παράδειγμα βάσης.
Ευχαριστώ

Γιώργος

tsgiannis 17-02-22 10:01

1 Συνημμένο(α)
Υπάρχει 1 θέμα "ερμηνείας"
Καταρχας ρίξε μια ματιά στο επισυναπτόμενο
1ον ..Μην ονομάζεις τις εφαρμογές χρησιμοποιώντας δεσμευμενες λέξεις...ονομαζόντας την round.accdb...ουσιαστικά ακύρωσες την Round
2ον ... μην κόβεις τα ψηφία στα δεδομένα σου ...αστα όπως τα πέρασες και μετά στην παρουσίαση θα κάνεις το manipulation
3ον .. Δες το ερώτημα για δεις πως με την Round και αναλόγως πως θα κόψεις θα παρεις και το επιθυμητό αποτέλεσμα
Τέλος σε όλες τις γλώσσες υπαρχουν προβλήματα "αριθμητικής αναπαράστασης" (δεν θυμάμαι τον όρο)
Δηλ το 402,425....στρογγυλλοποιείται σε 402,42 (ΛΑΘΟΣ) αλλά εσωτερικά πρέπει να έχει αποθηκευτεί σαν 402,4249999999

mousatos 17-02-22 10:39

Ευχαριστώ Γιάννη, Με τη δεσμευτική ονομασία απορούσα γιατί μου ακύρωνε τη συνάρτηση. Όμως το ζητούμενο είναι η εφαρμογή της λογικής στρογγυλοποίησης δηλαδή το προτελευταίο αριθμητικό ψηφίο αυξάνει κατά 1 εάν το τελευταίο είμαι >4 κ.ο.κ έτσι ώστε στο 402, 425 το 2 πρέπει να γίνει τρία και το 5 να φύγει.
καλή σου μέρα

tsgiannis 17-02-22 11:42

Να πω την αλήθεια καποιες φορές μου έτυχαν κάποια "λαθάκια" αυτού του τύπου αλλά δεν είχε τύχει ποτέ να ασχοληθώ καθώς δεν με ενοχλούσαν
Το κοίταξα όμως και εδώ έχει 2 λύσεις : https://www.techonthenet.com/access/...eric/round.php
Μου άρεσε η "πονηρή" λύση του τύπου
Κώδικας:

Round(YourNumber+0,000001;1)
Μπορεί να είναι τρελλά μπακάλικη αλλά δουλεύει γιατί προσπερνάει το πιο πάνω πρόβλημα με την "ορθή" αποθήκευση δεκαδικών αριθμών.... (και μην νομίζεις ότι κάτι ανάλογο δεν θα χρησιμοποείται ακόμα και απο πιο "High End" λύσεις)
EDIT: το πρόβλημα με την λανθασμένη στρογγυλοποίηση λέγεται Banker Rounding ...: https://stackoverflow.com/questions/...2-instead-of-3
Δες πως επηρεάζεται η ακρίβεια :
Κώδικας:

?round(12.650000000000001 ,1)  '12 Μηδενικά
 12,6
?round(12.65000000000001 ,1) '11 Μηδενικά
 12,7

EDIT2 : Βρήκα πως λέγεται αυτό το "πρόβλημα" :Αριθμοί Κινητής Υποδιαστολής https://www.cs.uoi.gr/~tsiatouhas/PLY307-CA/AppxB.pdf
και δες πως πραγματικά αποθηκεύεται ο αριθμός σου: (και η διαφορά Double - Single)
https://www.exploringbinary.com/floa...int-converter/
Κώδικας:

12.650000000000001 --> (Double) : 12.6500000000000003552713678800500929355621337890625
12.650000000000001 --> (Single) : 12.6499996185302734375

και όμοια :
Κώδικας:

402.4249346 --> (Double) -->402.42493459999997185150277800858020782470703125
402.4249346 --> (Single) -->402.4249267578125

Οπότε λίγο πολύ τα αποτελέσματα απο την πλευρά της Access και γενικώς οποιοδήποτε Υπολογιστή είναι σωστά

kapetang 17-02-22 13:08

Καλησπέρα στην παρέα

Σε οριακές περιπτώσεις η προσθήκη ενός μικρού αριθμού μπορεί να προκαλέσει λάθος αλλού.

Ένα παράδειγμα φαίνεται παρακάτω.

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 <----σωστό

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

mousatos 18-02-22 11:48

Ευχαριστώ Γιάννη και Γιώργο

kapetang 18-02-22 14:19

Γιώργο να είσαι καλά και ελπίζω να καλύφτηκες.

dimmag 18-02-22 17:02

Καλησπέρα
εγώ χρησιμοποιώ αυτόν τον τύπο

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)

Φιλικά Δημήτρης

kapetang 18-02-22 23:26

Καλησπέρα Δημήτρη

Συγκρίνοντας το γενικό τύπο με τον τύπο για 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 <---------------------λάθος

dimmag 19-02-22 08:38

Παράθεση:

Αρχική Δημοσίευση από kapetang (Μήνυμα 33524)
Καλησπέρα Δημήτρη

Συγκρίνοντας το γενικό τύπο με τον τύπο για 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.


Search Engine Optimization by vBSEO 3.3.2