PRB: Απώλεια ακρίβειας ενδέχεται να παρουσιαστεί κατά τη χρήση της SUM ή AVG λειτουργίες σε έναν τύπο με διαίρεση

ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.

Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:281341
Αυτό το αρχείο έχει αρχειοθετηθεί. Προσφέρεται “ως έχει” και δεν θα ενημερώνεται πια.
Συμπτώματα
Όταν χρησιμοποιείτε τη συνάρτηση συγκεντρωτικών αποτελεσμάτων SUM ή AVG με διαίρεση, το αποτέλεσμα χάνει την ακρίβεια. Η απώλεια ακρίβειας παρουσιάζεται ανεξάρτητα από το αν χρησιμοποιούν έναν τύπο αριθμητικών ή δεκαδικών δεδομένων.
Αιτία
Αυτή η συμπεριφορά είναι λόγω για τη φύση του τύπους δεκαδική και αριθμητικών δεδομένων και την περικοπή που προκύπτει ως αποτέλεσμα της την ακρίβεια και κλίμακα τιμών. Σύμφωνα με SQL Server ηλεκτρονικά εγχειρίδια, το αποτέλεσμα της sum(numeric(p,s)) είναι numeric(38,s). Στην περίπτωση του προηγούμενου, sum(amount) είναι numeric(38,9). Όταν έχετε μια έκφραση numeric(38,9) / numeric(15,9), θεωρητικά, το αποτέλεσμα είναι numeric(63,25). Ωστόσο, επειδή η μέγιστη ακρίβεια 38, περικόπτει το αποτέλεσμα σε (38,6).
Εναλλακτικός τρόπος αντιμετώπισης
Για να επιλύσετε αυτήν τη συμπεριφορά, χρησιμοποιήστε μία από τις εξής μεθόδους:
  • Χρησιμοποιήστε ένα αριθμητικό ως διαιρέτης. Για παράδειγμα:

    DECLARE @Quantity numeric(15,9)SET @Quantity = 3SELECT Round(CAST(Sum(t1.Amount) AS numeric(15,9))/@Quantity, 9) As CostFROM t1					
  • Αποθηκεύστε πρώτα το άθροισμα σε μια μεταβλητή και χρησιμοποιήστε τη μεταβλητή στον τύπο. Για παράδειγμα:

    declare @quantity numeric (15,9)set @quantity = 3declare @sum numeric (15,9)set @sum= (select sum(amount) from t1)select @sum/@quantity as cost					
  • Τοποθετήστε μια ρητή τιμή σε μια παρονομαστή. Για παράδειγμα:
    select sum(Amount)/3 from t1					
Περισσότερες πληροφορίες
Για να αναπαραγάγετε τη συμπεριφορά, εκτελέστε το παρακάτω ερώτημα από το Query Analyzer:
CREATE TABLE t1 (    Amount    numeric(15,9)    )GOINSERT INTO t1( Amount ) VALUES (0.7)INSERT INTO t1( Amount ) VALUES (1.3)SELECT Amount FROM t1/* result (correct, scale = 9)Amount      ----------------- .7000000001.300000000DECLARE @Quantity numeric(15,9)SET @Quantity = 3    SELECT t1.Amount / @Quantity As CostFROM t1				
Και πάλι, την κλίμακα και την ακρίβεια είναι σωστά στο αποτέλεσμα.

Ωστόσο, εάν χρησιμοποιείτε αυτόν τον κωδικό
DECLARE @Quantity numeric(15,9)<BR/>SET @Quantity = 3SELECT Sum(t1.Amount)/@Quantity As Cost<BR/>FROM t1				
το αποτέλεσμα είναι.666666.

Η απώλεια ακρίβειας δεν προκύπτει, εάν δώσετε μια ρητή τιμή ως παρονομαστή. Απώλεια ακρίβειας δεν παρουσιάζεται εάν τοποθετήσετε στην τιμή του αθροίσματος:
select sum(Amount)/3 from t1GOselect 2.0000000/@quantity				
Δεν υπάρχει απώλεια ακρίβειας παρουσιάζεται εάν αποθηκεύσετε SUM(amount) σε μια μεταβλητή και στη συνέχεια, χρησιμοποιήστε τη μεταβλητή. Η απώλεια ακρίβειας προκύπτει μόνο όταν χρησιμοποιείτε τη λέξη συγκεντρωτικές κλειδί SUM ή AVG ενός μαθηματικού τύπου με διαίρεση.
declare @quantity numeric (15,9)set @quantity = 3declare @sum numeric (15,9)set @sum= (select sum(amount) from t1)select @sum/@quantity as cost				
ακρίβεια SUM AVG περικοπή διαίρεσης

Προειδοποίηση: Αυτό το άρθρο έχει μεταφραστεί αυτόματα

Ιδιότητες

Αναγνωριστικό άρθρου: 281341 - Τελευταία αναθεώρηση: 12/05/2015 23:03:31 - Αναθεώρηση: 2.0

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbprb kbmt KB281341 KbMtel
Σχόλια
ERROR: at System.Diagnostics.Process.Kill() at Microsoft.Support.SEOInfrastructureService.PhantomJS.PhantomJSRunner.WaitForExit(Process process, Int32 waitTime, StringBuilder dataBuilder, Boolean isTotalProcessTimeout)