Decimal
The Decimal
type stores large numbers. It requires 16 bytes of memory, so it rarely truncates values. But this makes it less efficient and more awkward to use.
We use special functions, such as Add()
, with this type. These functions make Decimal
more complex, but also improves the quality of its output.
To start, this program uses the Decimal
type. We test the Decimal
in an If
-statement. We then add two Decimals together, and multiply and subtract Decimals.
Module Module1 Sub Main() Dim d As Decimal = 1.0 ' Test Decimal. If d = 1.0 Then Console.WriteLine(d) End If Dim y As Decimal = 0.5 ' Add Decimal. y += d Console.WriteLine(y) ' Subtract and multiply. y -= (d * 2) Console.WriteLine(y) End Sub End Module1 1.5 -0.5
Several constants are available on the Decimal
type. These include the MaxValue
, MinValue
, One, Zero and MinusOne
constants. We can use these constants to get the expected value.
Module Module1 Sub Main() Console.WriteLine(Decimal.MaxValue) Console.WriteLine(Decimal.MinValue) Console.WriteLine(Decimal.One) Console.WriteLine(Decimal.Zero) Console.WriteLine(Decimal.MinusOne) End Sub End Module79228162514264337593543950335 -79228162514264337593543950335 1 0 -1
Floor
, Ceiling
The Decimal.Floor
Function removes the fractional part of the Decimal
value. And the Decimal.Ceiling
Function always rounds up if the Decimal
value has a fractional value.
Math.Round
Function, which rounds based on specified arguments.Module Module1 Sub Main() ' Call Ceiling and Floor. Console.WriteLine(Decimal.Ceiling(1.1)) Console.WriteLine(Decimal.Floor(1.1)) End Sub End Module2 1
The Decimal
type provides arithmetic Functions. These include Add, Multiply, Subtract and Divide. These Functions make it known that we are using Decimals, not regular Integers.
Module Module1 Sub Main() Dim result1 = Decimal.Add(1.1, 1.3) Console.WriteLine(result1) Dim result2 = Decimal.Multiply(5.0, 2.0) Console.WriteLine(result2) Dim result3 = Decimal.Subtract(2.0, 1.0) Console.WriteLine(result3) Dim result4 = Decimal.Divide(10.0, 2.0) Console.WriteLine(result4) End Sub End Module2.4 10 1 5
Parse
, TryParse
We can use the Parse
and TryParse
shared methods on Decimal
. This program first parses the string
"100.01". It then tries to parse (with TryParse
) an invalid number.
TryParse
. It uses a tester-doer pattern. It instead just returns false on invalid values.Module Module1 Sub Main() ' Use Parse for valid arguments. Dim value As Decimal = Decimal.Parse("100.01") Console.WriteLine(value) ' Use TryParse for arguments that might be invalid. Dim value2 As Decimal If Decimal.TryParse("perl", value2) Then Console.WriteLine("Not reached") End If End Sub End Module100.01
Many conversion methods are available on the Decimal
type. We can convert a Decimal
into a Byte, Double
, Integer (including Shorts and Longs), or UInteger
.
Module Module1 Sub Main() Dim input As Decimal = 5.5 Console.WriteLine(Decimal.ToByte(input)) Console.WriteLine(Decimal.ToDouble(input)) Console.WriteLine(Decimal.ToInt16(input)) Console.WriteLine(Decimal.ToInt32(input)) Console.WriteLine(Decimal.ToInt64(input)) Console.WriteLine(Decimal.ToSByte(input)) Console.WriteLine(Decimal.ToSingle(input)) Console.WriteLine(Decimal.ToUInt16(input)) Console.WriteLine(Decimal.ToUInt32(input)) Console.WriteLine(Decimal.ToUInt64(input)) End Sub End Module5 5.5 5 5 5 5 5.5 5 5 5
How much memory does the Decimal
type use? We allocate an array of one million Decimal
elements. We then measure how much each element required, on average.
Decimal
element.Module Module1 Sub Main() ' Measure memory and allocate array of Decimals. Dim bytes1 As Long = GC.GetTotalMemory(True) Dim arr1(1000000) As Decimal Dim bytes2 As Long = GC.GetTotalMemory(True) arr1(0) = 0 ' Compute decimal sizes. Dim difference As Long = bytes2 - bytes1 Dim per As Double = difference / 1000000 Console.WriteLine("Program used: {0:0.0} MB", difference / (1024 * 1024)) Console.WriteLine("Each decimal element: {0:0.0} bytes", per) End Sub End ModuleProgram used: 15.3 MB Each decimal element: 16.0 bytes
Decimal
is a large and accurate numeric type—it occupies 16 bytes. We use it with special Functions on the Decimal
type. It stores large numbers with additional accuracy.