19 Temmuz 2020 Pazar

decimal tipi

decimal tipi
128 bit limited precision sağlar. 28-29 haneye tekabül eder. Bu sınıf tamamen para hesaplaması için icat edilmiştir.
decimal: 0.3333333333333333333333333333 - Toplam 28 hane, sıfır hariç
decimal tipi çok eskiden beri var. Açıklaması şöyle.
For what it's worth, the decimal type seems to predate .net. The .net framework CLR delegates the computations to the oleaut32 lib, and I could find traces of the DECIMAL type as far back as Windows 95
decimal ve double Karşılaştırması
decimal 128 bit olmasına rağmen double'dan daha küçük bir aralık kullanır.

Literal
Literal olarak kullanırken rakamın sonuna büyük M veya küçük m  koyarız.
Örnek
Şöyle yaparız.
decimal sum = 0M;
Örnek
Şöyle yaparız
(365m / 360m);
Floor metodu
Şöyle yaparız.
decimal d1 = 9.7m;
decimal d2 = decimal.Floor(d1);
GetBits metodu
Bir integer dizisi döner. Dizi şöyledir.
public static int[] GetBits(decimal d)
{
    return new int[]
    {
        d.lo,
        d.mid,
        d.hi,
        d.flags
    };
}
Flags alanının 16-23 arasındaki alanı "number of fractional decimal digits" bilgisini taşır. Mask olarak bence 0xFF (8 bit) kullanılmalı ancak bazı örneklerde 0x7F'te kullanılıyor.
decimal x = 12345.67890M;
int[] bits = decimal.GetBits(x);
byte scale = (byte) ((bits[3] >> 16) & 0xFF); 
operator + metodu
Şöyle yaparız.
decimal sum = 0M;
sum += 0.001M;
operator * metodu
İmzası şöyle
decimal operator *(decimal x, decimal y);
Örnek
Elimizde şöyle bir kod olsun. Çarpma işlemi decimal döner. Bölme işlemi de decimal döner. Sonuç decimal tipindendir.
sum * (365 / 360)
Örnek
Şöyle yaparız.
decimal quantityList = ...;
decimal price = ...;
decimal multipleProduct = price * quantity;
Remainder metodu
Şöyle yaparız.
decimal d1 = 9.7m;
decimal d2 = 6.3m;decimal fractional1 = decimal.Remainder(d1, decimal.Floor(d1));
Çıktı olarak şunu alırız.
.7
Precision metodu
Precision kavramı decimal precision ile karıştırılmamalı. Toplam kaç hane saklayabileceği anlamına gelir. Örnekte sayı toplam 10 hane kullanıyor.
var number = 12345.67890M;
var precision = number.Precision();
Assert.IsTrue(precision == 10);
ToString metodu
Açıklaması şöyle.
If format is null or an empty string, the return value of this instance is formatted with the general numeric format specifier (G).
Şöyle yaparız.
number.ToString("G");
TryParse metodu
Açıklaması şöyle.
When this method returns, contains the Decimal number that is equivalent to the numeric value contained in s, if the conversion succeeded, or zero if the conversion failed. The conversion fails if the s parameter is null or Empty, is not a number in a valid format, or represents a number less than MinValue or greater than MaxValue. This parameter is passed uininitialized; any value originally supplied in result is overwritten.
Örnek
Eksi sayısı temsil edern string'i parse etmek için şöyle yaparız.
decimal validity = -1;
var validityStr = "-1";

decimal.TryParse(validityStr, 
  NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign,
  CultureInfo.InvariantCulture, 
  out validity);
Diğer
Yuvarlama
Decimal şöyle yuvarlanabilir ancak ben bu yöntemi sevmiyorum çünkü ardışuk aritmetik işlemlerde para kaybına sebep oluyor.
decimal sum = 10.1234M;
sum = Math.Round(sum, 3);
En güzeli sonucu yuvarlayarak göstermek. Şöyle yaparız.
Console.WriteLine("Sum: {0:F3}", sum);

Hiç yorum yok:

Yorum Gönder