How to: implementazione personalizzata arrotondamento procedure

Traduzione articoli Traduzione articoli
Identificativo articolo: 196652 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sommario

Sono disponibili un numero di diversi algoritmi di arrotondamento nei prodotti Microsoft. Arrotondamento algoritmi compreso aritmetiche arrotondamento in funzione Round() del foglio di lavoro di Excel effettuato arrotondamento nelle funzioni CInt(), CLng() e Round() in Visual Basic, Applications Edition. Viene descritto quali di Visual Basic vari Applications funzioni di arrotondamento si e fornisce esempi di utilizzo delle funzioni. Inoltre, l'articolo include funzioni di esempio che implementano vari algoritmi di arrotondamento.

Informazioni

Arrotondamento descrizione

╚ necessario arrotondare quando si desidera convertire un numero di maggiore precisione in un numero minore precisione. Il caso pi¨ comune Ŕ quando Ŕ necessario convertire un numero a virgola mobile in un valore integer.

Arrotondamento verso il basso

La forma pi¨ semplice di arrotondamento Ŕ troncamento. Qualsiasi cifra dopo la precisione desiderata viene semplicemente ignorati. La funzione VBA Fix() Ŕ un esempio di troncamento. Ad esempio, Fix(3.5) Ŕ 3 e Fix(-3.5) Ŕ -3.

La funzione INT() arrotondato per difetto all'intero massimo minore del valore. Sia Int() Fix() funzionano allo stesso modo con numeri positivi - troncamento - e ottenere risultati diversi per i numeri negativi: Int(-3.5) fornisce da -4.

La funzione Fix() Ŕ un esempio di arrotondamento simmetrico, perchÚ influisce sulla grandezza (valore assoluto) di numeri positivi e negativi nello stesso modo in cui. La funzione INT() Ŕ un esempio di arrotondamento asimmetrica perchÚ interessa la grandezza di numeri positivi e negativi in modo diverso.

Excel dispone di funzioni di foglio di calcolo simile: Int() Floor() e RoundDown(). Int() funziona allo stesso modo come int() in Visual Basic, Applications Edition. Floor() tronca i valori positivi, ma non funziona con numeri negativi. La funzione RoundDown() funziona nello stesso modo la funzione VBA Fix().

Microsoft SQL Server dispone di una funzione Round() che pu˛ essere utilizzato come la funzione VBA Fix(). SQL Server inoltre dispone di una funzione di Floor(), funziona allo stesso modo come funzione INT() VBA.

Arrotondamento verso l'alto

SQL Server ed Excel dispongono di una funzione denominata Ceiling(), che viene sempre arrotondato frazione di (positivo pi¨) al valore successivo.

Visual Basic, Applications Edition non Ŕ una funzione di accesso round corrispondente. Tuttavia, per i numeri negativi sia Fix() e int() utilizzabili per arrotondare verso l'alto, in modi diversi.

Fix() arrotonda a 0 (up nel senso assoluto, ma verso il basso in termini di grandezza assoluto). Fix(-3.5) Ŕ-3.5.

Int() arrotondato da 0 (alto in termini di grandezza assoluto, ma verso il basso nel senso assoluto). Int(-3.5) Ŕ da -4.

Arrotondamento aritmetici

Quando si arrotondano sempre inattivo o attivo, il numero risultante non Ŕ necessariamente il pi¨ vicino al numero originale. Ad esempio, se si arrotondare 1,9 a 1, la differenza Ŕ molto superiore se Ŕ arrotondato fino a 2. ╚ facile verificare che i numeri da 1.6 a 2.4 devono essere arrotondati al 2.

Tuttavia, cosa 1.5, che Ŕ equidistante compreso tra 1 e 2? Per convenzione, il numero a metÓ viene arrotondato.

╚ possibile implementare arrotondamento di numeri a metÓ in modo simmetrico, tale 0,5 viene arrotondato per difetto su -1 o in modo asimmetrico, in cui 0,5 viene arrotondato a 0.

Le funzioni riportate di seguito forniscono arrotondamento aritmetici simmetrica:
La funzione di foglio di calcolo di Excel Round().
La funzione di SQL Server Round() possibile eseguire l'arrotondamento aritmetici simmetrica.

La funzione riportata di seguito forniscono arrotondamento aritmetici asimmetrica:
Il metodo Round() della libreria Math Java.

Qualsiasi funzione che esegue l'arrotondamento aritmetici non dispone di Visual Basic, Applications Edition.

Numero pari di arrotondamento

Quando si aggiungono valori arrotondati, sempre arrotondamento 0,5 nella stessa direzione comporta una differenza che cresce pi¨ numeri aggiunta insieme. Un modo per ridurre al minimo la differenza consiste con arrotondamento.

Arrotonda arrotondamento numero pari 0,5 fino a volte e gi¨ a volte. La convenzione Ŕ arrotondare al numero pari pi¨ vicino, in modo che sia 1.5 e 2.5 arrotondare 2 e 3.5 e 4.5 che entrambi arrotondare a 4. Arrotondamento Ŕ simmetrico.

In Visual Basic, Applications Edition, eseguono arrotondamento le seguenti funzioni numeriche: CByte(), CInt(), CLng(), CCur() e Round().

Non sono disponibili funzioni di foglio di calcolo di Excel che eseguono l'arrotondamento.

Arrotondamento casuale

Anche arrotondamento, Ŕ possibile differenza totali. ╚ possibile eseguire un passaggio aggiuntivo per rimuovere la distorsione, arrotondando 0,5 alto o verso il basso in modo casuale. In questo modo, anche se i dati sono deliberatamente distorta, differenza potrebbe essere ridotta a icona. Tuttavia, utilizzando l'arrotondamento casuale con dati distribuiti in modo casuale potrebbe causare un pi¨ grande differenza di arrotondamento. Arrotondamento casuale potrebbe causare due totali di diversi sugli stessi dati.

Prodotti non Microsoft implementano qualsiasi tipo di routine di arrotondamento casuale.

Alternative di arrotondamento

Arrotondamento alternativo Ŕ arrotondamento tra 0,5 backup e 0,5 verso il basso in chiamate successive.

Prodotti non Microsoft implementano una routine di arrotondamento alternativa.

La funzione Round() Ŕ implementato in modo incoerente

La funzione Round() non implementata in modo coerente tra diversi prodotti Microsoft per motivi storici.

Nella tabella riportata di seguito si riferisce prodotto implementazione:
   Product                             Implementation
   ----------------------------------------------------------------------
   Visual Basic for Applications 6.0   Banker's Rounding
   Excel Worksheet                     Symmetric Arithmetic Rounding
   SQL Server                          Either Symmetric Arithmetic Rounding
                                       or Symmetric Round Down (Fix)
                                       depending on arguments

   Java Math library                   Asymmetric Arithmetic Rounding
				

La funzione di Round() in Visual Basic 6.0 e Visual Basic, Applications Edition 6.0 esegue l'arrotondamento. Dispone di un argomento di secondo facoltativo che specifica il numero di cifre decimali, arrotondare per:
   Debug.Print Round(2.45, 1) returns 2.4.
				

Dati di esempio

Nella tabella riportata di seguito sono riportati alcuni dati di esempio e gli effetti dei vari metodi di arrotondamento nel numeri e i totali generati.
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -2.6   -3   -2  -2      -3          -3           -3       -3     -3
   -2.5   -3   -2  -2      -2          -3           -2       -2     -3
   -2.4   -3   -2  -2      -2          -2           -2       -2     -2
   -1.6   -2   -1  -1      -2          -2           -2       -2     -2
   -1.5   -2   -1  -1      -1          -2           -2       -1     -1
   -1.4   -2   -1  -1      -1          -1           -1       -1     -1
   -0.6   -1    0   0      -1          -1           -1       -1     -1
   -0.5   -1    0   0       0          -1            0       -1     -1
   -0.4   -1    0   0       0           0            0        0      0
    0.4    0    0   1       0           0            0        0      0
    0.5    0    0   1       1           1            0        1      1
    0.6    0    0   1       1           1            1        1      1
    1.4    1    1   2       1           1            1        1      1
    1.5    1    1   2       2           2            2        1      1
    1.6    1    1   2       2           2            2        2      2
    2.4    2    2   3       2           2            2        2      2
    2.5    2    2   3       3           3            2        3      3
    2.6    2    2   3       3           3            3        3      3
				

Totale di tutti i numeri:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   0.0    -9   0   9       3            0           0        1      0
				

Totale di tutti i numeri negativi:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -13.5  -18  -9  -9      -12          -15         -13      -13    -14
				

Totale di tutti i numeri positivi:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   13.5   9    9   18      15           15          13       14     14
				

La tabella viene visualizzata la differenza tra i vari metodi di arrotondamento. Per distribuite in modo casuale i numeri positive e negative, Fix(), arrotondamento aritmetici simmetrica, arrotondamento e arrotondamento alternati forniscono la differenza minima dai totali effettivi, con arrotondamento casuale non molto dietro.

Se i numeri sono sia a tutti i positivo o negativo tutti, mezzo arrotondamento, alternati arrotondamento e arrotondamento casuale tuttavia la differenza minima dai totali effettivi.

Funzioni definite dall'utente arrotondamento di esempio

Il codice di esempio nella sezione seguente listato funzione fornisce le implementazioni di esempio per ciascuno dei tipi arrotondamento descritti.

Le funzioni disponibili sono:
   AsymDown      Asymmetrically rounds numbers down - similar to Int().
                 Negative numbers get more negative.

   SymDown       Symmetrically rounds numbers down - similar to Fix().
                 Truncates all numbers toward 0.
                 Same as AsymDown for positive numbers.

   AsymUp        Asymmetrically rounds numbers fractions up.
                 Same as SymDown for negative numbers.
                 Similar to Ceiling.

   SymUp         Symmetrically rounds fractions up - that is, away from 0.
                 Same as AsymUp for positive numbers.
                 Same as AsymDown for negative numbers.

   AsymArith     Asymmetric arithmetic rounding - rounds .5 up always.
                 Similar to Java worksheet Round function.

   SymArith      Symmetric arithmetic rounding - rounds .5 away from 0.
                 Same as AsymArith for positive numbers.
                 Similar to Excel Worksheet Round function.

   BRound        Banker's rounding.
                 Rounds .5 up or down to achieve an even number.
                 Symmetrical by definition.

   RandRound     Random rounding.
                 Rounds .5 up or down in a random fashion.

   AltRound      Alternating rounding.
                 Alternates between rounding .5 up or down.

   ATruncDigits  Same as AsyncTrunc but takes different arguments.
				

Tutte queste funzioni accettano di due argomenti: il numero da arrotondare e un fattore facoltativo. Se il fattore viene omesso, le funzioni restituiscono un valore integer creato da uno dei metodi sopra. Se il fattore viene specificato, il numero verrÓ ridimensionato per il fattore per creare diversi effetti di arrotondamento. AsymArith (2.55, 10) produce ad esempio 2.6, ovvero viene arrotondato al fattore di 1/1/10 di = = 0,1.

Nota: Fattore pari a 0 genera un errore in fase di esecuzione: 1/fattore = 1/0.

Nella tabella seguente sono illustrati gli effetti di vari fattori:
   Expression       Result  Comment
   --------------------------------------------------------------------
   AsymArith(2.5)     3     Rounds up to next integer.
   BRound(2.18, 20)   2.2   Rounds to the nearest 5 cents (1/20 dollar).
   SymDown(25, .1)   20     Rounds down to an even multiple of 10.
				

L'eccezione alla descrizione del precedente Ŕ ADownDigits, che Ŕ una funzione di modello che consente di specificare il numero di cifre decimali, anzichÚ un fattore.
   Expression            Result Comment
   ---------------------------------------------------------------------
   ADownDigits(2.18, 1)    2.1  Rounds down to next multiple of 10 ^ -1.
				

Elenco di funzione


   Function AsymDown(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     AsymDown = Int(X * Factor) / Factor
   End Function

   Function SymDown(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     SymDown = Fix(X * Factor) / Factor
   '  Alternately:
   '  SymDown = AsymDown(Abs(X), Factor) * Sgn(X)
   End Function

   Function AsymUp(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   Dim Temp As Double
     Temp = Int(X * Factor)
     AsymUp = (Temp + IIf(X = Temp, 0, 1)) / Factor
   End Function

   Function SymUp(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   Dim Temp As Double
     Temp = Fix(X * Factor)
     SymUp = (Temp + IIf(X = Temp, 0, Sgn(X))) / Factor
   End Function

   Function AsymArith(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     AsymArith = Int(X * Factor + 0.5) / Factor
   End Function

   Function SymArith(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
     SymArith = Fix(X * Factor + 0.5 * Sgn(X)) / Factor
   '  Alternately:
   '  SymArith = Abs(AsymArith(X, Factor)) * Sgn(X)
   End Function

   Function BRound(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   '  For smaller numbers:
   '  BRound = CLng(X * Factor) / Factor
   Dim Temp As Double, FixTemp As Double
     Temp = X * Factor
     FixTemp = Fix(Temp + 0.5 * Sgn(X))
     ' Handle rounding of .5 in a special manner
     If Temp - Int(Temp) = 0.5 Then
       If FixTemp / 2 <> Int(FixTemp / 2) Then ' Is Temp odd
         ' Reduce Magnitude by 1 to make even
         FixTemp = FixTemp - Sgn(X)
       End If
     End If
     BRound = FixTemp / Factor
   End Function

   Function RandRound(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   ' Should Execute Randomize statement somewhere prior to calling.
   Dim Temp As Double, FixTemp As Double
     Temp = X * Factor
     FixTemp = Fix(Temp + 0.5 * Sgn(X))
     ' Handle rounding of .5 in a special manner.
     If Temp - Int(Temp) = 0.5 Then
       ' Reduce Magnitude by 1 in half the cases.
       FixTemp = FixTemp - Int(Rnd * 2) * Sgn(X)
     End If
     RandRound = FixTemp / Factor
   End Function

   Function AltRound(ByVal X As Double, _
            Optional ByVal Factor As Double = 1) As Double
   Static fReduce As Boolean
   Dim Temp As Double, FixTemp As Double
     Temp = X * Factor
     FixTemp = Fix(Temp + 0.5 * Sgn(X))
     ' Handle rounding of .5 in a special manner.
     If Temp - Int(Temp) = 0.5 Then
       ' Alternate between rounding .5 down (negative) and up (positive).
       If (fReduce And Sgn(X) = 1) Or (Not fReduce And Sgn(X) = -1) Then
       ' Or, replace the previous If statement with the following to
       ' alternate between rounding .5 to reduce magnitude and increase
       ' magnitude.
       ' If fReduce Then
         FixTemp = FixTemp - Sgn(X)
       End If
       fReduce = Not fReduce
     End If
     AltRound = FixTemp / Factor
   End Function

   Function ADownDigits(ByVal X As Double, _
            Optional ByVal Digits As Integer = 0) As Double
     ADownDigits = AsymDown(X, 10 ^ Digits)
   End Function
				

Nota: con eccezione di funzione di Excel MRound() foglio di lavoro, predefinito aggiuntivo arrotondamento funzioni accettano argomenti in modo di ADownDigits, in cui il secondo argomento specifica il numero di cifre anzichÚ un fattore di.

Le implementazioni di arrotondamento presentate in questo articolo utilizzare un fattore, come MRound(), che Ŕ pi¨ flessibile perchÚ non Ŕ necessario arrotondare a una potenza di 10. ╚ possibile scrivere funzioni wrapper nel formato ADownDigits.

Mobile punto limitazioni

Tutte le implementazioni di arrotondamento presentate in questa sezione utilizzare il tipo di dati double, che pu˛ rappresentare circa 15 cifre decimali.

PoichÚ non tutti i valori frazionari possono essere espressa esattamente, Ŕ possibile ottenere risultati imprevisti perchÚ il valore visualizzato non corrisponde al valore archiviato.

Ad esempio, il numero 2,25 potrebbe essere stato memorizzato internamente come 2.2499999..., che verrÓ arrotondato per difetto con arrotondamento aritmetici, invece di backup come Ŕ prevedibile. Inoltre, ulteriori calcoli che viene inserito un numero tramite la maggiore possibilitÓ che il valore binario memorizzato verrÓ diversa dal valore decimale ideale.

Se questo Ŕ il caso, sarÓ necessario scegliere un tipo di dati diversi, ad esempio valuta, che corrisponde esattamente a 4 cifre decimali.

╚ inoltre possibile apportare la tipi di dati Variant e l'utilizzo CDec() per convertire il tutto nel tipo di dati Decimal, che pu˛ essere esatto a 28 cifre decimali.

Valori di valuta arrotondamento

Quando si utilizza il tipo di dati valuta, che corrisponde esattamente a 4 cifre decimali, in genere si desidera arrotondare per centesimi 2 cifre decimali.

La funzione di Round2CB riportato di seguito Ŕ una variante hardcoded che esegue l'arrotondamento a 2 cifre decimali, ma non moltiplicare il numero originale. Ci˛ evita una condizione di overflow possibile se l'importo in valuta sta per raggiungere i limiti del tipo di dati valuta.
   Function Round2CB (ByVal X As Currency) As Currency
     Round2CB = CCur(X / 100) * 100
   End Function
				

Valori decimali di arrotondamento

Di seguito Ŕ un esempio di asimmetrica aritmetici arrotondamento utilizzando il tipo di dati decimal:
   Function AsymArithDec(ByVal X As Variant, _
            Optional ByVal Factor As Variant = 1) As Variant
     If Not IsNumeric(X) Then
       AsymArithDec = X
     Else
       If Not IsNumeric(Factor) Then Factor = 1
       AsymArithDec = Int(CDec(X * Factor) + .5)
     End If
   End Function
				

Eliminazione di precisione come un collegamento di arrotondamento

L'arrotondamento come insegnato a scuola, Ŕ in genere aritmetico arrotondamento utilizzando numeri positivi. Con questo tipo di arrotondamento, Ŕ necessario conoscere il numero per 1 cifra precedente in cui sono arrotondamento al. ╚ ignorare cifre oltre la prima posizione decimale. In altre parole, la precisione Ŕ stata eliminata come scelta rapida per il valore di arrotondamento.

Ad esempio, sia 2.5 e 2.51 arrotondato fino a 3, mentre sia 2.4 e 2.49 arrotondare per difetto a 2.

Quando si utilizza arrotondamento (o altri metodi che arrotondano 0,5 in alto o verso il basso) o quando l'arrotondamento di numeri negativi, utilizzando l'arrotondamento aritmetici asimmetrica, l'eliminazione di precisione pu˛ comportare risultati non corretti in cui non pu˛ essere arrotondato al numero pi¨ vicino.

Ad esempio, con arrotondamento, 2.5 Arrotonda verso il basso a viene arrotondato a 2 e 2.51 fino a 3.

Con arrotondamento aritmetici asimmetrica-2.5 arrotondato fino a tra -2 mentre-2.51 Arrotonda per difetto a da -3.

Le funzioni definite dall'utente presentate in questo articolo consente di tenere precisione completa del numero in considerazione quando si esegue l'arrotondamento.

Riferimenti

Guida di Visual Basic, versione 6.0; argomento: Int e Fix funzioni; funzione round

Transact SQL Guida; argomento: funzione ARROTONDA, funzione floor; funzione matematico

(c) 1998 Microsoft Corporation, tutti i diritti riservati. Il contributo di Malcolm Stewart, Corporation.

ProprietÓ

Identificativo articolo: 196652 - Ultima modifica: giovedý 15 luglio 2004 - Revisione: 3.2
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Chiavi:á
kbmt kbhowto KB196652 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 196652
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com