Kerekítési módszerek MDX-ben (Arithmetic & Banker's Rounding)

Tudta Ön hogy a Round() függvény a 2,5-öt lefelé, a 3,5-öt felfelé kerekíti? Próbálja ki!

with

member [Measures].[2,5 kerekítve] as 'Round(2.5, 0)'

member [Measures].[3,5 kerekítve] as 'Round(3.5, 0)'

select

{[Measures].[2,5 kerekítve], [Measures].[3,5 kerekítve]}

on columns

from [Adatkocka]

 

Banker's rounding

Ahogy az ábráról leolvasható a Round() függvény a 2,5-öt 2-re, a 3,5-öt 4-re kerekíti. Első ránézésre talán úgy tűnhet, mintha ez egy bug lenne, hiszen ez a kerekítési módszer nem felel meg a kerekítés általános szabálya alatt tanult módszernek. Pedig ez nem hiba, csak a VBA Round() függvény nem a kerekítés általános szabálya szerint kerekít.

A kerekítés általános szabálya (Arithmetic Rounding)

A kerekítés általános szabálya szerint az 0,5 től felfelé, 0,49-től lefelé kell kerekíteni. Azaz a 0,5 már 1 lesz, míg a 0,49 nulla. Ezt a módszert használja az Excel, és az SQL server Round() függvénye is.

Banker’s Rounding.

Ha sok kerekített értékeket kell összeadnunk, és a ,5-öt mindig felfelé kerekítjük, akkor az eredmény szép lassan elkezd torzítani. Ha ezt ki akarjuk küszöbölni, akkor a ,5-öt néha felfelé, néha lefelé kell kerekítenünk.

A Banker’s kerekítés lényege, hogy az ,5-öt néha felfelé, néha lefelé kerekíti (így csökkenti az egyirányú kerekítés torzítását). A Banker’s kerekítés mindig páros számra kerekít. A 2,5-öt 2-re, a 3,5-öt 4-re. És pont így működik a VBA Round() függvénye.

Összefoglalva: Ha azt akarjuk, hogy MDX lekérdezésünk a kerekítés általános szabálya szerint kerekítsen, akkor a VBA Round() függvény helyet használjuk ez Excel Round() függvényét:

with

member [Measures].[2,5 kerekítve] as 'Excel!Round(2.5, 0)'

member [Measures].[3,5 kerekítve] as 'Excel!Round(3.5, 0)'

select

{[Measures].[2,5 kerekítve], [Measures].[3,5 kerekítve]}

on columns

from [adatkocka]

 

Eredménye:

kerekítés a kerekítés általános szabálya szerint

 

Felhasznált irodalom:

Kapcsolódó anyagok:

Kővári Attila - BI projekt

hozzászólás

A simple and intelligent point, well made. Thanks!

Új hozzászólás