Pontatlan számítási eredmények: amikor a nulla nem nulla

floatingpoint1Öcsém mutatott pár napja egy érdekes hibát az Excelben. Összeadott néhány számot, az eredménynek 0-nak kellett volna lennie, e helyett azonban valami ilyesmit kapott: 1,4210854715202E-14

Például az alábbi nagyon egyszerű esetben, ahol egy SZUM formulával számoltuk az összeget:

Mi ez az E betűs furcsaság?

Az E betűs furcsaság a tudományos (Scientific) számformátum: az E betű után álló szám (-14) azt jelenti, hogy 10-nek ezzel a hatványával kell megszorozni az előtte álló számot. Az Excel automatikusan ebbe a formátumba tette a számot, mert a cellára nem volt más formázás beállítva.

Ha átállítod a formázást Számra és 30 tizedes jegyre, ezt fogod látni:

floatingpoint02

Tehát ez egy nagyon kicsit szám, egy majdnem-nulla érték. De mégsem nulla, pedig látjuk, hogy a fenti 4 szám összege pontosan nulla kellene, hogy legyen.

Miért nem nulla?

Azért, mert a számokat a számítógép kettes számrendszerben (vagyis bináris számként) tárolja, és ami a jól megszokott tizes számrendszerben egyszerű, véges tizedes tört (pl. 0,1) az kettes számrendszerben lehet végtelen szakaszos tört (0,0001100110011100110011…). Ilyen esetben pedig – mivel a számok tárolására szolgáló memória véges – a szám kerekítődik, csonkolódik. Ezzel a sok számjegyből álló bináris tört számmal végzünk aztán műveletet, s előfordulhat, hogy a tört rész megmarad a számítás végére is. Ezt aztán tizes számrendszerbe visszakonvertálva nem 0-t, hanem egy 0-hoz közeli számot kapunk.

Ez tehát egy sajátosság, amit megváltoztatni nem tudunk – azonban vannak egyszerű módszerek, amivel áthidalhatjuk a problémát.

MEGOLDÁSOK

Szám formátum beállítása

A legegyszerűbb eset az, amikor nem kell ezzel a majdnem-nulla számmal tovább számolni: ilyenkor elég, ha beállítod a Szám formátumot, és annyi tizedes jegyet, amennyi számodra fontos. A fenti esetben például egy tizedest:

floatingpoint4

A beállítást a Kezdőlap (Home)  közepén levő Szám csoportban tudod megadni. A legördülő listában válaszd a Szám-ot (Number), és állítsd be a tizedes jegyeket a kis nyilas-nullás gombokkal:

floatingpoint03

Kerekítés

A probléma súlyosabb, ha a majdnem-nulla számot fel szeretnéd használni valamire. Tipikus eset, hogy az ilyen számításokat ellenőrzésre használjuk, és be szeretnénk ágyazni egy HA (IF) formulába például:

=HA( B7=0 ; „rendben” ; „hiba” )

=IF( B7=0 , „rendben” , „hiba” )

Ez a formula a fenti esetben „hiba”-t ad vissza, mert az összeg csak majdnem-nulla, nem pontosan nulla. Ahhoz, hogy pontosan 0-t kapjunk, az eredeti összeget kerekíteni kell. Ezt legegyszerűbben a KEREKTÉS (ROUND) formulával tudod megtenni. Második paraméternek kell megadnod, hogy hány tizedes jegyre kerekítesz. Ez mindig legalább annyi legyen, mint ahány tizedes jegyű számokkal dolgozol. [Gábor: Így van eza hibaellenőrzésnél megmondjuk, hogy milyen kis hiba az, amit még tolerálunk. Persze általában az ember nem arra gondol, hogy maga az Excel fog hibázni… 😉 ]

=KEREKÍTÉS( SZUM(B2:B5) ; 2)

=ROUND( SZUM(B2:B5) , 2 )

Én itt biztos, ami biztos, két tizedesre kerekítettem.

Így már az ellenőrzés sem mutat hibát:

floatingpoint5

Mostmár akár feltételes formázást is építhetsz az összegző formulára… de ez majd egy következő cikk témája lesz! 🙂

 

Vélemény, hozzászólás?

Your email address will not be published.

css.php