Bagikan melalui


Struktur System.Decimal

Nota

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Decimal Jenis nilai mewakili angka desimal mulai dari positif 79.228.162.514.264.337.593.543.950 335 menjadi negatif 79.228.162.514.264.337.593.543.950.335. Nilai default dari adalah Decimal 0. Jenis nilai Decimal sesuai untuk perhitungan keuangan yang memerlukan sejumlah besar digit integral dan pecahan yang signifikan, kemudian tidak terjadi kesalahan pembulatan. Meskipun menggunakan jenis Decimal, kebutuhan untuk pembulatan tetap ada. Sebaliknya, ini meminimalkan kesalahan karena pembulatan. Misalnya, kode berikut menghasilkan hasil 0,99999999999999999999999999999, bukan 1.

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor);
let dividend = Decimal.One
let divisor = 3m
// The following displays 0.9999999999999999999999999999 to the console
printfn $"{dividend/divisor * divisor}"
Dim dividend As Decimal = Decimal.One
Dim divisor As Decimal = 3
' The following displays 0.9999999999999999999999999999 to the console
Console.WriteLine(dividend/divisor * divisor)

Ketika hasil pembagian dan perkalian diteruskan ke Round metode , hasilnya tidak kehilangan presisi, seperti yang ditunjukkan oleh kode berikut.

decimal dividend = Decimal.One;
decimal divisor = 3;
// The following displays 1.00 to the console
Console.WriteLine(Math.Round(dividend/divisor * divisor, 2));
let dividend = Decimal.One
let divisor = 3m
// The following displays 1.00 to the console
printfn $"{Math.Round(dividend/divisor * divisor, 2)}"
Dim dividend As Decimal = Decimal.One
Dim divisor As Decimal = 3
' The following displays 1.00 to the console
Console.WriteLine(Math.Round(dividend/divisor * divisor, 2))

Angka desimal adalah nilai floating-point yang terdiri dari tanda, nilai numerik di mana setiap digit dalam nilai berkisar dari 0 hingga 9, dan faktor penskalaan yang menunjukkan posisi titik desimal mengambang yang memisahkan bagian integral dan pecahan dari nilai numerik.

Representasi biner dari nilai Decimal adalah 128-bit yang terdiri dari angka bilangan bulat 96-bit, dan sekumpulan bendera 32-bit yang mewakili hal-hal seperti faktor tanda dan penskalaan yang digunakan untuk menentukan bagian mana darinya adalah pecahan desimal. Oleh karena itu, representasi biner dari Decimal nilai formulir, (-296 hingga 296) / 10(0 hingga 28)), di mana -(296-1) sama dengan MinValue, dan 296-1 sama dengan MaxValue. Untuk informasi selengkapnya tentang representasi nilai biner dan sebuah contoh, lihat konstruktor Decimal dan metode Decimal(Int32[]).

Faktor penskalakan juga mempertahankan nol berikutnya dalam angka Decimal . Nol berikutnya tidak memengaruhi nilai Decimal angka dalam operasi aritmatika atau perbandingan. Namun, nol akhir mungkin diungkapkan oleh metode ToString jika string format yang sesuai diterapkan.

Pertimbangan konversi

Jenis ini menyediakan metode yang mengonversi nilai Decimal ke dan dari nilai SByte, Int16, Int32, Int64, Byte, UInt16, UInt32, dan UInt64. Konversi dari jenis integral ini menjadi Decimal adalah konversi yang memperluas yang tidak pernah kehilangan informasi atau menyebabkan pengecualian.

Konversi dari Decimal ke salah satu jenis integral mempersempit konversi yang membulatkan Decimal nilai ke nilai bilangan bulat terdekat menuju nol. Beberapa bahasa, seperti C#, juga mendukung konversi Decimal nilai ke Char nilai. Jika hasil konversi ini tidak dapat diwakili dalam jenis tujuan, OverflowException pengecualian akan dilemparkan.

Jenis Decimal ini juga menyediakan metode untuk mengonversi nilai Decimal menjadi nilai Single dan Double. Konversi dari Decimal ke Single atau Double mempersempit konversi yang mungkin kehilangan presisi tetapi bukan informasi tentang besarnya nilai yang dikonversi. Konversi tidak menghasilkan pengecualian.

Konversi dari Single atau Double untuk Decimal memberikan OverflowException pengecualian jika hasil konversi tidak dapat direpresentasikan sebagai Decimal.

Melakukan operasi pada nilai Desimal

Jenis ini Decimal mendukung operasi matematika standar seperti penambahan, pengurangan, pembagian, perkalian, dan negasi unary. Anda juga dapat bekerja langsung dengan representasi biner dari nilai Decimal dengan memanggil GetBits metode .

Untuk membandingkan dua Decimal nilai, Anda dapat menggunakan operator perbandingan numerik standar, atau Anda dapat memanggil CompareTo metode atau Equals .

Anda juga dapat memanggil anggota Math kelas untuk melakukan berbagai operasi numerik, termasuk mendapatkan nilai absolut angka, menentukan nilai maksimum atau minimum dari dua Decimal nilai, mendapatkan tanda angka, dan membulatkan angka.

Contoh

Contoh kode berikut menunjukkan penggunaan Decimal.

/// <summary>
/// Keeping my fortune in Decimals to avoid the round-off errors.
/// </summary>
class PiggyBank {
    protected decimal MyFortune;

    public void AddPenny() {
        MyFortune = Decimal.Add(MyFortune, .01m);
    }

    public decimal Capacity {
        get {
            return Decimal.MaxValue;
        }
    }

    public decimal Dollars {
        get {
            return Decimal.Floor(MyFortune);
        }
    }

    public decimal Cents {
        get {
            return Decimal.Subtract(MyFortune, Decimal.Floor(MyFortune));
        }
    }

    public override string ToString() {
        return MyFortune.ToString("C")+" in piggy bank";
    }
}
/// Keeping my fortune in Decimals to avoid the round-off errors.
type PiggyBank() =
    let mutable myFortune = 0m

    member _.AddPenny() =
        myFortune <- Decimal.Add(myFortune, 0.01m)

    member _.Capacity =
        Decimal.MaxValue

    member _.Dollars =
        Decimal.Floor myFortune

    member _.Cents =
        Decimal.Subtract(myFortune, Decimal.Floor myFortune)

    override _.ToString() =
        $"{myFortune:C} in piggy bank"
' Keeping my fortune in Decimals to avoid the round-off errors.
Class PiggyBank
    Protected MyFortune As Decimal

    Public Sub AddPenny()
        MyFortune = [Decimal].Add(MyFortune, 0.01D)
    End Sub

    Public ReadOnly Property Capacity() As Decimal
        Get
            Return [Decimal].MaxValue
        End Get
    End Property

    Public ReadOnly Property Dollars() As Decimal
        Get
            Return [Decimal].Floor(MyFortune)
        End Get
    End Property

    Public ReadOnly Property Cents() As Decimal
        Get
            Return [Decimal].Subtract(MyFortune, [Decimal].Floor(MyFortune))
        End Get
    End Property

    Public Overrides Function ToString() As String
        Return MyFortune.ToString("C") + " in piggy bank"
    End Function
End Class