Wstęp
Każdy kto pisze jakiś kod, kiedyś w końcu wykona jakieś działania arytmetyczne i ich wynik będzie chciał pokazać w jakimś zaokrągleniu.
Wtedy czy z dokumentacji, czy z internetu natknie się na funkcje Round(). No nic prostszego przekazujemy liczbę i ilość miejsc po przecinku i mamy oczekiwany rezultat…
Problem
Problem pojawi się szybciej lub później, ale na pewno będzie wychwycony przez dociekliwych użytkowników. Round do zaokrąglania połówek używa metody bankiera (Banker’s Rounding)
(źródło: http://support.microsoft.com/kb/196652).
O co w tym chodzi?
Chodzi o to, że w przypadku wartości połówkowych (.5) zaokrąglenie jest do najbliższej liczby parzystej, czyli:
Round(1.5,0) => 2
Round(2.5,0) => 2
Mówiąc szczerze nigdy nie potrzebowałem tej metody, ale widać w US jest to stosowane…
Rozwiązanie
Jedynym rozwiązaniem jest napisanie własnej funkcji do zaokrąglania wartości, i tu dziwnym przypadkiem okazuje się, że najłatwiej osiągnąć to wykorzystując funkcje Format, która zaokrągla w sposób arytmetyczny:
Function RoundA(ByVal d As Double, Optional ile As Integer = 0) as Double Dim f As String If ile <= 0 Then f = "0" Else f = "0." & String(ile, "0") End If RoundA = CDbl(format(d, f)) End Function
Podsumowanie
Jeżeli potrzebujemy w naszych obliczeniach zaokrągleń znanych nam ze szkoły podstawowej, musimy użyć własnej funkcji, co nie powinno nastręczyć większych problemów.
Nie używam akurat accessa, co zwróci Round(1.5,2)?
Zwróci 1.5, mój błąd który już poprawiłem w poście, przykład powinien być zaokraglenia do zera miejsc, a nie jednego miejsca…
Banker’s Rounding = Metoda bankiera!
Rzeczywiście jakoś tak przepisałem z “e” i wyszło mi nazwisko;) Dzięki, poprawiłem.