Różnica między double a decimal

0

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?

0
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

0

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

3

W skrócie to double dla szybkości, decimal dla dokładności.

6

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
        }
    }
}
0

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;
            }      
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0