Implement özel yordamlar yuvarlama nasıl

Makale çevirileri Makale çevirileri
Makale numarası: 196652 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Microsoft ürünlerinde bir dizi farklı yuvarlama algoritmalarına vardır. Algoritmalar arasındadır aritmetik yuvarlama Excel'in çalışma sayfası Round() fonksiyonunda Banker'ın yuvarlama CInt() CLng() ve Round() işlevlerinde Visual Basic for Applications yuvarlama. Bu makalede, hangi çeşitli Visual Basic for Applications yuvarlama işlevlerini yapmak ve işlevleri kullanma örnekleri sağlanır açıklanır. Buna ek olarak, makaleyi çeşitli yuvarlama algoritmaları gerçekleştiren örnek işlevleri içerir.

Daha fazla bilgi

Yuvarlama açıklanıyor.

Daha fazla duyarlık çok sayıda küçük duyarlık sayıya dönüştürmek istediğiniz yuvarlamak gerekir. Kayan noktalı sayı bir tamsayı dönüştürmek gerektiğinde en sık kullanılan durumdur.

Aşağı yuvarlama

Yuvarlama basit kesme formdur. Herhangi basamak istediğiniz duyarlık yalnızca göz ardı edilir. VBA Fix() işlevi, kesme örneğidir. Örneğin, Fix(3.5) 3, ve Fix(-3.5) -3.

Int() işlevi tamsayıya en yüksek değerden daha az yuvarlar. ınt() hem Fix() - kesiliyor - pozitif bir sayı ile aynı şekilde davranır, ancak farklı sonuçlar için negatif bir sayı verin: -4 Int(-3.5) sağlar.

Bir örnek ayn? ?ekilde pozitif ve negatif sayı (mutlak değer) boyutları etkilediğinden simetrik yuvarlama Fix() işlevdir. Boyutları pozitif ve negatif sayıların farklı etkiler, çünkü asimetrik yuvarlama örnek ınt() işlevdir.

Excel, benzer bir elektronik tablo işlevleri içerir: ınt() Floor() ve RoundDown(). Int() Visual Basic for Applications ınt() aynı şekilde çalışır. Floor() pozitif değerler keser, ancak negatif bir sayı ile çalışmıyor. RoundDown() işlevi VBA Fix() işlevi ile aynı biçimde çalışır.

Microsoft SQL Server, VBA Fix() işlev gibi davranan bir Round() işlevi vardır. SQL Server, VBA ınt() işlevi ile aynı biçimde çalışır bir Floor() işlevi de vardır.

Yukarı yuvarlama

SQL Server ve Excel, her zaman için sonraki değer (daha fazla pozitif) kesir değerleri yuvarlar ceiling() adlı bir fonksiyon var.

Visual Basic for Applications, karşılık gelen bir Yuvarlak Yukarı işlevi yok. Ancak, negatif sayılar için Fix() hem ınt() yukarı doğru farklı şekillerde yuvarlamak için kullanılabilir.

0'ın doğru Fix() yuvarlar (mutlak anlamda, mutlak boyutları açısından ancak aşağı yukarı). Fix(-3.5)-3.5 ' dir.

ınt() 0 uzağa yuvarlar (mutlak boyutları açısından, mutlak bir anlamda ancak aşağı yukarı). Int(-3.5) -4 olur.

Aritmetik yuvarlama

Her zaman aşağı veya yukarı yuvarlarken, elde edilen sayı en mutlaka yakın özgün numarası değil. 1'Için basılı 1.9 yuvarlak, örneğin, bu kadar 2 yuvarlak, daha çok daha büyük farktır. 2.4 1.6 Numaralarını 2'ye yuvarlanmasını görmek daha kolaydır.

Ancak, ne, yaklaşık 1 ve 2'arasında equidistant olan 1.5? Kuralı tarafından yarım çift yönlü sayı yukarı yuvarlanır.

-.5 -1 Veya burada-.5 0 olarak yukarı yuvarlanır, simetrik olmayan bir biçimde yuvarlan?r, simetrik bir biçimde yarı çift yönlü sayıları yuvarlamayı uygulayabilirsiniz.

Aşağıdaki işlevler, simetrik aritmetik yuvarlama sağlar:
Excel'in Round() elektronik tablo işlevi.
SQL Server Round() işlevi, simetrik aritmetik yuvarlama yapabilirsiniz.

Asimetrik aritmetik yuvarlama aşağıdaki işlevi girin:
Java Math kitaplığı Round() yöntemi.

Visual Basic for Applications aritmetik yuvarlama yapar herhangi bir işlev yoktur.

Banka'nın yuvarlama

Yuvarlanan bir değer eklediğinizde birlikte, her zaman aynı.5 yuvarlama daha fazla sayılarla, büyüyor bir sapma yönü sonuçları birbirine ekleyin. Farkı biçimlendirmek en aza indirmek için bir banka'nın yuvarlama ile yoludur.

Banka'nın yuvarlama yuvarlar.5 bazen ayarlayın ve bazen aşağı. 2, 3.5 Ve her ikisi de 4'e yuvarlamasını 4.5, 1.5 hem de 2.5 yuvarlamak için en yakın çift sayıya yuvarlamak için kuralıdır. Banka'nın yuvarlama simetrik olur.

Banka'nın yuvarlama, Visual Basic for Applications'de, aşağıdaki sayısal işlevleri gerçekleştirir: CByte(), CInt() CLng() CCur() ve Round().

Banka'nın yuvarlama yapmak yok bir Excel elektronik tablo işlevleri vardır.

Rasgele yuvarlama

Hatta Banka'nın yuvarlama toplamları bias. Sapma.5 gerçekten rasgele biçimde aşağı veya Yukarı yuvarlama olarak kaldırmak için ek bir adım alabilir. Verileri kasten biased olsa bile, böylece, sapma simge durumunda. Ancak, rasgele rasgele Dağıtılmış veri yuvarlama kullanarak banka'nın yuvarlama değerinden daha büyük bir sapma neden olabilir. Rasgele yuvarlama aynı veriler iki farklı toplamları neden olabilir.

Hiçbir Microsoft ürünleri, rasgele yuvarlama yordamın herhangi bir sıralama kullanır.

Yuvarlama alternatif

Diğer yuvarlama yukarı.5 ile 0,5 aşağı arasında birbirini izleyen çağrılarda yuvarlama.

Hiçbir Microsoft ürünleri, diğer bir yuvarlama yordamı uygulayın.

Tutarsız uygulanmayan Round() işlev olur.

Round() işlevi geçmiş nedeniyle farklı Microsoft ürünleri arasında tutarlı biçimde uygulanmadı.

Aşağıdaki tabloda, uygulama için ürün ile ilgilidir:
   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
				

Visual Basic 6.0 ve Visual Basic for Applications 6.0 Round() işlevinde, Banka'nın yuvarlama yapar. Bu, kendisine yuvarlamak için ondalık basamak sayısını belirleyen bir isteğe bağlı ikinci bağımsız değişkeni vardır:
   Debug.Print Round(2.45, 1) returns 2.4.
				

Örnek veri

Aşağıdaki tabloda, sayılar ve toplamları oluşturulan bazı örnek veriler ve çeşitli yuvarlama yöntemleri etkisini gösterir.
   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
				

Tüm sayıların toplamı:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   0.0    -9   0   9       3            0           0        1      0
				

Tüm negatif sayıların toplamı:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   -13.5  -18  -9  -9      -12          -15         -13      -13    -14
				

Pozitif sayının toplamı:
   Number/Int./Fix/Ceiling/Asym. Arith./Sym. Arith./Banker's/Random/Alt.
   ---------------------------------------------------------------------
   13.5   9    9   18      15           15          13       14     14
				

Tabloda, çeşitli yuvarlama yöntemleri arasındaki fark gösterilir. Rasgele dağıtılmış pozitif ve negatif sayılar, Fix(), simetrik aritmetik yuvarlama, Banka'nın yuvarlama ve yuvarlama değişen rasgele değil, ne kadar gerisinde yuvarlama ile gerçek Toplamlar'den az fark sağlar.

Sayılar, ancak ya da tüm pozitif veya negatif tüm banka'nın yuvarlama, yuvarlama değişen ve rasgele yuvarlama fiili toplam gelen en az bir fark sağlar.

Örnek kullanıcı tanımlı işlevler yuvarlama

Örnek kod aşağıdaki işlev kod bölümünde açıklanan yuvarlama türleri için örnek uygulamaları sağlar.

Sağlanan işlevler şunlardır:
   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.
				

Tüm bu işlevleri, iki bağımsız değişkeni alır: yuvarlanmasını numarası ve isteğe bağlı bir faktör. Faktör atlanırsa, sonra işlevleri, yukarıdaki yöntemlerden birini kullanarak oluşturulan bir tamsayı döndürür. Faktör belirtilmezse, sayı farklı yuvarlama efektleri faktörüyle ölçeklenir. Örneğin AsymArith (2.55, 10), 2.6 üretir, bunu diğer bir deyişle, 1/faktörü yuvarlar = 1/10 = 0,1.

Not: BIR faktörü, 0, bir çalıştırma hatası üretir: 1/faktörü = 1/0.

Aşağıdaki tablo, çeşitli etkenlere etkisini göstermektedir:
   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.
				

Yukarıdaki açıklama istisnası, ondalık basamak sayısını bir etmen yerine belirtmenize olanak veren bir şablon işlevi olan ADownDigits ' dir.
   Expression            Result Comment
   ---------------------------------------------------------------------
   ADownDigits(2.18, 1)    2.1  Rounds down to next multiple of 10 ^ -1.
				

Liste işlevi


   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
				

Not: Excel'in MRound() çalışma sayfası işlevi, yerleşik dışında - yuvarlamayı bağımsız şekilde ADownDigits, ikinci bağımsız değişken, basamak sayısını bir etmen yerine burada belirler, işlevleri gerçekleştirin.

Burada sunulan bir yuvarlama uygulamaları, 10 kuvvetine yuvarlanacak sahip olmadığınız için daha esnek olduğu gibi MRound() bir etmen kullanın. Sarıcı işlevleri, ADownDigits şekilde yazabilirsiniz.

Nokta kısıtlamaları kayan

Tüm Burada sunulan bir yuvarlama uygulamaları yaklaşık 15 ondalık basamağı gösterebilir double veri türünü kullanın.

Tüm ondalık değerleri tam olarak ifade edilebilir olduğundan, görüntü değer saklanan değeri eşleşmediğinden beklenmeyen sonuçlar alabilirsiniz.

Örneğin, 2,25 numarayı dahili olarak olarak, aritmetik yuvarlama sahip aşağı yuvarlama, 2.2499999..., depolanmış olabilir yerine beklediğiniz gibi ayarlayın. Bir sayı ile büyük olasılığı ideal ondalık değeri depolanan ikili değeri farklı put Ayrıca, daha fazla hesaplamaları.

Bu durumda, 4 basamağa tam olan para birimi gibi farklı veri türü seçmek isteyebilirsiniz.

Variant veri türleri ve <a1>kullanım</a1> her şey olabilir decimal veri türüne dönüştürmek için CDec() 28 ondalık basamağa kadar tam yapma da düşünebilirsiniz.

Para birimi değerleri yuvarlama

Tam olarak 4 ondalık basamağa kadar olan para birimi veri türünü kullandığınızda genelde cents için 2 ondalık basamak yuvarlamak istediğiniz.

Round2CB işlevi için 2 ondalık basamak Banka'nın yuvarlama yapar, ancak özgün numarasını çarpın bir kodlanmış bir türevidir. Bu, Parasal Tutar para birimi veri türü sınırlarını yaklaştığını bildiren, olası taşma koşul engeller.
   Function Round2CB (ByVal X As Currency) As Currency
     Round2CB = CCur(X / 100) * 100
   End Function
				

Ondalık değerleri yuvarlama

Ondalık veri türünü kullanarak asimetrik aritmetik yuvarlama bir örnek aşağıda verilmiştir:
   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
				

Yuvarlama, bir kısayol olarak duyarlığı siliniyor

Okul içinde taught, yuvarlama pozitif sayılar kullanarak yuvarlama genellikle aritmetik aynıdır. Yuvarlama bu türüyle, yalnızca 1 basamak geçmişte olduğu için yuvarlama için numarasını bilmeniz gerekir. Önceki, ilk ondalık basamak basamakları yoksayın. Diğer bir deyişle, duyarlık değerini yuvarlama için bir kısayol olarak bırakılır.

2.4 Hem 2.49 2 aşağı yuvarlama yaparken Örneğin 2.5 hem de 2.51 3, yuvarlak edin.

Kullandığınız banka'nın yuvarlama (veya diğer yöntemleri.5 yukarı veya aşağı yuvarlamak) veya negatif sayılar asimetrik aritmetik yuvarlama kullanarak yuvarlak, duyarlık bırakarak hatalı sonuçlar için burada, en yakın sayıya yuvarlamak. neden olabilir.

Örneğin, Banka'nın yuvarlama ile 2.5 yuvarlar, 2 ve 2.51 3 yuvarlar.

-3 Için-2.51 yuvarlar durumdayken asimetrik aritmetik yuvarlama ile en çok -2 nin yuvarlar.

Bu makalede sunulan kullanıcı tanımlı işlevler numarası'nın tam duyarlılık yuvarlama yaparken dikkate.

Referanslar

Visual Basic Yardımı, sürüm 6.0; konu: ınt, işlevler, düzeltme; yuvarlak işlev

Microsoft Transact SQL Yardımı; konu: yuvarlak işlev; <a2>floor fonksiyon</a2>; <a4>Avize işlevi

(c) Microsoft Corporation 1998, tüm hakları saklıdır. Tarafından katkıyı Malcolm ılgaz, Microsoft Corporation.

Özellikler

Makale numarası: 196652 - Last Review: 15 Temmuz 2004 Perşembe - Gözden geçirme: 3.2
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbhowto KB196652 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:196652

Geri Bildirim Ver

 

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