Jak implementovat vlastní postupy zaokrouhlení

Překlady článku Překlady článku
ID článku: 196652 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Počet různých zaokrouhlení algoritmy jsou k dispozici v aplikaci Microsoft produkty. Zaokrouhlení algoritmy v rozsahu od aritmetické zaokrouhlení v aplikaci Excel Funkce listu Round() na bankovní společnosti zaokrouhlení v CInt(), CLng(), a Funkce Round() v jazyce Visual Basic for Applications. Tento článek popisuje Co dělat různé jazyka Visual Basic for Applications funkce zaokrouhlení a obsahuje ukázky použití funkcí. Kromě toho článek zahrnuje Funkce vzorku, které implementují různé algoritmy zaokrouhlení.

Další informace

Zaokrouhlení vysvětleno.

Potřebujete zaokrouhlit, pokud chcete převést číslo vyšší přesnosti do čísla menší přesností. Nejběžnější případ je, když potřebujete Převeďte celé číslo s plovoucí desetinnou čárkou.

Zaokrouhlení dolů

Nejjednodušší forma zaokrouhlení je zkrácení. Všechny číslice po požadované přesnost se jednoduše ignorují. Příkladem je funkce jazyka VBA Fix() zkrácení. Například Fix(3.5) je 3 a je Fix(-3.5) -3.

Funkce Int() zaokrouhlí dolů na celé nejvyšší číslo menší než hodnota. Int() a Fix() jednat stejným způsobem jako s kladná čísla - zkrácení- ale poskytují různé výsledky záporných čísel: dává Int(-3.5) -4.

Funkce Fix() je příkladem symetrické zaokrouhlení, protože ovlivňuje kladných a záporných čísel ve stejné velikosti (absolutní hodnota) způsob. Funkce Int() je příkladem asymetrické zaokrouhlení, protože ji jinak ovlivňuje velikost kladných a záporných čísel.

Aplikace Excel obsahuje podobné funkce: Int(), Floor() a RoundDown(). Int() pracuje stejným způsobem jako Int() v jazyce Visual Basic for Applications. Floor() zkrátí kladné hodnoty, ale nepracuje se záporná čísla. Funkce RoundDown() funguje stejně jako funkce Fix() jazyka VBA.

Microsoft SQL Server má funkci Round(), která mohou sloužit jako VBA Fix() funkce. SQL Server má také funkci Floor(), která pracuje stejným způsobem jako funkce VBA Int().

Zaokrouhlení

SQL Server a aplikace Excel mají funkci nazvanou Ceiling(), které vždy Zaokrouhlí zlomek hodnoty nahoru (Další kladné) na nejbližší hodnotu.

Visual Basic for Applications nemá odpovídající zaokrouhlit nahoru funkce. Avšak pro záporná čísla Fix() a Int() lze použít Zaokrouhlit nahoru, různými způsoby.

Fix() se zaokrouhlí směrem k 0 (nahoru ve smyslu absolutní, ale dolů z hlediska absolutní velikosti). Fix(-3.5) je-3.5.

Int() zaokrouhlí směrem od 0 (nahoru jde o absolutní velikost, ale dolů v absolutní smysl). Int(-3.5) je -4.

Aritmetické zaokrouhlení

Při zaokrouhlování vždy nahoru nebo dolů, není nutně výsledné číslo nejblíže k původní číslo. Například zaokrouhlit 1.9 k 1 rozdíl je mnohem větší, než pokud jste ji zaokrouhlovat až 2. Je snadné zobrazíte tak, že čísla od 1.6 2.4 se zaokrouhlí na 2.

Nicméně, co 1.5, což je stejnou vzdálenost mezi 1 a 2? Podle úmluvy, polovině číslo zaokrouhleno.

Zaokrouhlení čísla polovině symetrické způsobem, můžete implementovat takové že-.5 -1 nebo asymetrické způsobem, kde-.5 je zaokrouhleno dolů zaokrouhlí nahoru na 0.

Tyto funkce poskytují symetrické aritmetické zaokrouhlení:
Funkce tabulky aplikace Excel Round().
Funkce SQL Server Round() můžete provést symetrické aritmetické zaokrouhlení.

Tyto funkce poskytují asymetrické aritmetické zaokrouhlení:
Metoda Round() Java Math library.

Visual Basic for Applications nemá žádné funkce, která nemá Aritmetické zaokrouhlení.

Bankovní zaokrouhlení

Po přidání zaokrouhlené hodnoty společně, vždy zaokrouhlení 0,5 ve stejném Přidat směrem vede bias, který roste s další čísla společně. Jedním způsobem, jak minimalizovat bias je bankovní zaokrouhlení.

Bankovní zaokrouhlení zaokrouhlí 0,5 někdy nahoru a dolů někdy. Úmluvy je zaokrouhlit na nejbližší sudé číslo, aby 1.5 a 2.5 zaokrouhlit 2 a 3,5 a 4,5 obě kulaté 4. Bankovní zaokrouhlení je symetrické.

V jazyce Visual Basic for Applications proveďte následující číselné funkce bankovní společnosti zaokrouhlení: CByte(), CInt(), CLng(), CCur() a Round().

Neexistují žádné tabulky funkce aplikace Excel provést bankovní zaokrouhlení.

Náhodné zaokrouhlení

Dokonce i bankovní zaokrouhlení může usměrňovat součty. Můžete provést další krok Zaokrouhlení nahoru nebo dolů 0,5 skutečně náhodnými způsobem odeberte bias. Tímto způsobem i v případě, že data v s předpětím úmyslně, může být minimalizováno bias. Však pomocí náhodného zaokrouhlení s náhodně distribuovanými daty může dojít bias větší než bankovní společnosti zaokrouhlení. Náhodné zaokrouhlení může vést ke dvěma různé souhrny na stejná data.

Žádné produkty společnosti Microsoft provádět řazení náhodné zaokrouhlení postupu.

Alternativní zaokrouhlení

Alternativní zaokrouhlení je mezi 0,5 nahoru a dolů 1,3 zaokrouhlení na sobě volání.

Žádné produkty Microsoft implementovat alternativní procedury pro zaokrouhlení.

Funkce Round() se nekonzistentně implementována.

Funkce Round() není implementována konzistentním způsobem mezi z historických důvodů různých produktů společnosti Microsoft.

V následující tabulce se týká produktu implementace:
   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
				

Funkce Round() v jazyce Visual Basic 6.0 a Visual Basic for Applications 6.0 provádí bankovní zaokrouhlení. Má volitelný druhý argument, Určuje počet desetinných míst zaokrouhlit:
   Debug.Print Round(2.45, 1) returns 2.4.
				

Ukázková Data

Následující tabulka uvádí ukázkových dat a různých účinků metody na čísla a součty generovat zaokrouhlení.
   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
				

Součet všech čísel:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   0.0    -9   0   9       3            0           0        1      0
				

Součet všech záporných čísel:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -13.5  -18  -9  -9      -12          -15         -13      -13    -14
				

Součet všech kladných čísel:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   13.5   9    9   18      15           15          13       14     14
				

Tabulka ukazuje rozdíl mezi různé metody zaokrouhlení. Pro náhodně distributed kladných a záporných čísel, Fix(), symetrické Aritmetické zaokrouhlení, bankovní zaokrouhlení a střídání zaokrouhlení poskytují nejmenší rozdíl od skutečné celkové součty s není zcela náhodné zaokrouhlení na pozadí.

Nicméně pokud jsou čísla buď všechny kladné nebo všechny záporné bankovní zaokrouhlení, střídání zaokrouhlení a náhodné zaokrouhlení poskytují nejméně rozdíl od skutečné celkové součty.

Uživatelem definované funkce zaokrouhlení vzorku

Ukázkový kód v následující části funkce výpis obsahuje ukázku implementace jednotlivých popsaných typů zaokrouhlení.

Uvedené funkce jsou:
   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.
				

Všechny tyto funkce trvat dva argumenty: číslo zaokrouhlí a volitelné faktor. Jestliže je faktor vynechán, bude funkce vrátit celé číslo vytvořené podle jedné z výše uvedených metod. Pokud je zadán koeficient, číslo je měřítkem faktorem můžete vytvářet různé efekty zaokrouhlení. Například AsymArith (2.55, 10) vytváří 2.6, to znamená, zaokrouhlí se 1/koeficient = 1/10 = 0,1.

Poznámka: Faktor 0 generuje chyba spuštění: 1/koeficient = 1/0.

Následující tabulka zobrazuje vliv různých faktorů:
   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.
				

Výjimkou z výše uvedeného popisu je ADownDigits, což je šablona funkce, která umožňuje určit počet desetinných míst, nikoli faktor.
   Expression            Result Comment
   ---------------------------------------------------------------------
   ADownDigits(2.18, 1)    2.1  Rounds down to next multiple of 10 ^ -1.
				

Funkce výpis


   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
				

Poznámka: S výjimkou aplikace Excel MRound() funkci listu k integrovanému- funkce zaokrouhlení přijmout argumenty způsobem ADownDigits, kde druhý argument určuje počet číslic místo faktoru.

Použití zaokrouhlení implementace zde uvedené faktorem, stejně jako MRound(), což je pružnější, protože nemáte zaokrouhlit násobkem 10. ADownDigits způsobem, který můžete psát funkce souhrnného seznamu stop.

Plovoucí bod omezení

Všechny zaokrouhlení implementace zde uvedené použití dat double typ, který představuje přibližně 15 desítkovými číslicemi.

Protože ne všechny zlomkové hodnoty mohou být vyjádřeny přesně, může získat neočekávané výsledky, protože zobrazená hodnota neodpovídá uložené hodnota.

Například číslo 2,25 může být uchovány jako..., 2.2499999 s aritmetické zaokrouhlení, kterou by zaokrouhlit dolů namísto nahoru, jak by se očekáváte. Číslo je provedena, větší také další výpočty možnost, že budou uložené binární hodnoty odchylovat od ideální Desítková hodnota.

Pokud je tomu tak, můžete vybrat jiný datový typ, například Měna, která je přesně na 4 desetinná místa.

Také můžete zvážit nastavení dat typy Variant a CDec() k použití vše převeďte na desetinný datový typ, který může být přesné 28 desetinná místa.

Zaokrouhlení hodnoty měny

Pokud použijete typ dat Měna, která je přesně na 4 desetinná místa, obvykle chcete zaokrouhlit na 2 desetinná místa pro centů.

Funkci Round2CB je pevně variantu, která provádí bankovní zaokrouhlování na 2 desetinná místa, ale původní Nevynásobí číslo. Tím předejdete možného přetečení, pokud je peněžní částka blíží mezích typ dat Měna.
   Function Round2CB (ByVal X As Currency) As Currency
     Round2CB = CCur(X / 100) * 100
   End Function
				

Zaokrouhlení desetinných hodnot.

Následuje příklad asymetrické aritmetické zaokrouhlení pomocí Desetinný datový typ:
   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
				

Ztrácejí přesnost jako zástupce zaokrouhlení

Vyučovaných ve škole, zaokrouhlení je obvykle aritmetické zaokrouhlení pomocí pozitivní čísla. S tímto typem zaokrouhlení pouze musíte znát číslo 1 číslice v minulosti kde jsou zaokrouhlování na. Ignorovat číslic za první desetinné místo. Jinými slovy přesnost je vynechána jako zástupce Zaokrouhlení hodnoty.

Například zaokrouhlit 2.5 a 2.51 až 3, při 2.4 a 2.49 kola na 2.

Při použití zaokrouhlení bankovní (nebo jiné metody, které zaokrouhlení 0,5 buď nahoru nebo dolů) nebo při zaokrouhlení záporná čísla pomocí asymetrického aritmetický zaokrouhlení, ztrácejí přesnost může vést k nesprávné výsledky, kde může být není zaokrouhlit na nejbližší číslo.

Například s bankovní zaokrouhlení, 2.5 zaokrouhlí dolů na zaokrouhlí číslo 2 a 2.51 až 3.

Pomocí asymetrického aritmetické zaokrouhlení zaokrouhlí 2,5 až -2 při-2.51 Zaokrouhlí číslo dolů na -3.

Uživatelem definované funkce uvedené v tomto článku brát plně číslo přesnost v úvahu při zaokrouhlení.

Odkazy

Nápověda pro Visual Basic, verze 6.0; téma: Int, opravit funkcí; Funkce ZAOKROUHLIT

Microsoft Transact SQL Nápověda; téma: Round Funkce; Funkce ZAOKR.dolů; Strop Funkce

(c) Microsoft Corporation 1998, všechna práva vyhrazena. Příspěvky Miroslav Stewart, Microsoft Corporation.

Vlastnosti

ID článku: 196652 - Poslední aktualizace: 23. dubna 2011 - Revize: 5.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual Basic Control Creation Edition
  • Microsoft Visual Basic 5.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 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
Klíčová slova: 
kbhowto kbmt KB196652 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:196652

Dejte nám zpětnou vazbu

 

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