Witam, mam pytanie odnośnie tych 2 typów zmiennych. Obydwa są zmiennoprzecinkowe z jakąś tam precyzją. Wiem że decimal ma 16 bajtów a nie 8 jak double, ale czy jest między nimi jakaś konkretna różnica gdzie lepiej używać jednego z gdzie drugiego?
maczamp napisał(a):
Witam, mam pytanie odnośnie tych 2 typów zmiennych. Obydwa są zmiennoprzecinkowe z jakąś tam precyzją. Wiem że decimal ma 16 bajtów a nie 8 jak double, ale czy jest między nimi jakaś konkretna różnica gdzie lepiej używać jednego z gdzie drugiego?
Jest
Uważa się, że operacje na pieniądzach => decimal
I ogólnie tam, gdzie oczekujesz dokładności "daleko" po przecinku.
Generalnie Googluje
C# decimal vs double
oraz
C# double vs decimal
W skrócie to double
dla szybkości, decimal
dla dokładności.
Najważniejsza różnica to że typ double przechowuje liczby w systemie o podstawie 2, a typ decimal w systemie o podstawie 10.
Nie wszystkie liczby zapisane w systemie 10 da się dokładnie zapisać w systemie 2, dlatego do finansów się używa decimal.
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
double x = 0.1;
double xx = x + x + x;
Console.WriteLine("{0:R}", xx); // 0,30000000000000004
decimal y = 0.1M;
decimal yy = y + y + y;
Console.WriteLine("{0}", yy); // 0,3
}
}
}
Na temat liczb zmiennoprzecinkowych przeczytaj sobie tutaj : https://eduinf.waw.pl/inf/alg/006_bin/0021.php to zrozumiesz.
,natomiat liczby decimal są kodowane wewnętrznie w bardzo prosty sposób . Pisałem rok temu już o tym:
Decimal to struktura, która ma 4 pola po 32 bity czyli łącznie 128 . Nie wszystkie bity są wykorzystywane.
int lo
int mid
int hi
int flags
public Decimal(int lo, int mid, int hi, bool isNegative, byte scale)
{
this.lo = lo;
this.mid = mid;
this.hi = hi;
flags = scale << 16;
if(isNegative)
{
flags = flags | -0x80000000;
}
}