Za uvod nekoliko teorije
IEEE single in double
Zaokrožitvena napaka
C# float
V okolju .NET je prej opisano število v plavajoči vejici IEEE single predstavljeno z numeričnim podatkovnim tipom float. Bolj natančno z binarnim numeričnim tipom.
Uporabljamo ga lahko, ko ni potrebna velika natančnost pri zaokroževanju. Ker pa je arhitektura sodobnih procesorjev prilagojena računanju z numeričnim podatkovnim tipom double, je vedno manj uporabljan.
C# double
IEEE double je v .NET predstavljen kot double. Tako kot float je to binarni numerični podatkovni tip v plavajoči vejici.
Ta numerični podatkovni tip je najpogosteje uporabljan številski tip v plavajoči vejici. Sodobni procesorji so optimizirani za računanje z njim.
C# decimal
V okolju .NET je decimal numerični podatkovni tip v plavajoči vejici. Tako kot double in float. A za razliko od teh dveh decimal ni binarni tip temveč uporablja osnovo 10. S tem je bolj prilagojen povprečni človeški predstavitvi števil. Posledično se odpravi zaokrožitvena napaka za delo v desetiškem sistemu.
Decimal uporabljamo ko je potrebna velika natančnost in kjer si ne moremo privoščiti zaokrožitvene napake. Namensko je bil narejen za delo z denarjem. Ker ima desetiško osnovo ga je najbolje uporabljati v primerih kjer delamo z podatki, ki so produkt človeka. Zaradi 128 bitnega zapisa in neprilagojenosti modernih procesorjev je delo z njim počasnejše v primerjavi z float in double.
Končnica double - d ali D
V primeru Hello World double ste morda opazili črko med številkami v stavku: double d = 1d / 3. Ta d takoj za 1 pomeni, da se mora številka 1 obravnavati kot double in ne kot int. V splošnem se decimalno število na desni strani argumenta obravnava kot double. Če pa imamo na desni strani celo število moramo eksplicitno povedati, da ga želimo obravnavati kot double, zato dodamo končnico. Če končnice ne uporabim, prevajalnik sicer ne sproži napake, vendar pa je rezultat nepričakovan:
|
|
|
Končnica float - f ali F
Do sedaj smo spoznali, da imamo težavico pri kombinaciji double = celo število. Pri float je posabnosti še več. Celoštevilski argument na desni strani se avtomatsko tretira kot int. Če ga želimo prirediti podatkovnemu tipu float je potrebno dodati končnico f ali F.

"Uporaba končnice"

"Brez uporabe končnice"
Float ima še eno posebnost. Realna števila na desni strani se avtomatsko tretirajo kot double. Če poiskušam realno število prirediti spremenljivki tipa float kar brez uporabe končnice nas prevajalnik opozarja na napako:
Posledično moram tudi pri prirejanju realnih števil uporabiti končnico f ali F:
Končnica decimal - m ali M
Decimal se pri vnašanju obnaša enako kot float. Pri prirejanju celega števila brez končnice prevajalnik ne sproži napake, a rezultati so nenavadni:
Pri prirejanju realniega števila brez končnice nas prevajalnik opozori, saj se realno število na desni strani tretira kot double:
Zato moram uporabiti končnico:
Float v double in obratno
Imejmo neko realno število shranjeno v spremenljivki f tipa float. Imejmo še spremenljivko d1 tipa double. Pri prirejanju d1 = f ni nobenega problema.
Ker je double bolj natančen podatkovni tip kot float, se ta sprememba ne zgodi čisto eksplicitno. Primer:
Double si nastavi vrednost, ki je najbližji približek 0.3333333.
Imejmo spremenljivko tipa double d v kateri je shranjeno realno število. Imejmo še spremenljivko tipa float f1. Pri prirejanju f1 = d se prevajalnik pritoži, češ da numeričnih tipov ne moremo kar tako spreminjati. Prirejanje popravim v f1 = (float)d. Tako se spremenljivki double le odrežejo nepotrebna decimalna mesta in dobim float.
Float in double v decimal in obratno
Ko prirejamo spremenljivko tipa double 'd' ali float 'f' spremenljivki tipa decimal 'de' moramo vedno uporabiti pristop:
Ker decimal deluje na desetiški osnovi tu problemov z zaokroževanjem ni. Še več, decimal pri izpisu 'odreže' nepotrebne ničle.
Pri prirejanju spremenljivke tipa decimal 'de' v spremenljivko tipa float ali double moram uporabiti pristop:
Ker je decimal tip z večjo natančnostjo, se pri spremembi le odrežejo nepotrebne decimalke.
Vaje in viri
Nekaj rešenih primerov, nerešenih nalog ter kvizov lahko najdete na spodnji povezavi: