We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you two Citrix podcasts. Learn about 2020 trends and get answers to your biggest Citrix questions!Listen Now

x

# Truncating a double into its integer and decimal parts.

on
Medium Priority
956 Views
vb2005

i need to perform a very basic thing: i have a Double variable called ReadHours which stores an amount of hours.
Suppose the variable is now holding the value 1.89
i am trying to extract the value 1 (the integer part of the Double, without rounding) on a different variable, and also the value 0.89 on another (the fractional value after i extracted the integer part).

for the life of me, ive been trying for the past 2 hours! does any of you have any ideas on this one? id rather not use Visual Basic namespace at all.

BTW, as clarification, i am trying to present my user with a readable hour and minute value rather than the 1.89 which is unreadable in terms of span. if i could achieve this separation i stated before, i could just present the integer part as the hours, and the fractional part * 60 as the minutes. ill give the points too if somebody has ideas on a better approach to this, maybe there is some hidden class that will do this for me...

thanks!!
Comment
Watch Question

## View Solutions Only

Commented:
Load the double into a decimal, and then you can use Decimal.Truncate to get the integer portion.  Subtract that from the original to get the fractional part.

Commented:
Can it really be this easy?

Dim myVal As Double = 1.89

Dim strVal As String() = myVal.ToString.Split(".")

Dim myInt As Integer = CInt(strVal(0))
Dim MyDec As Decimal = CDec("0." & strVal(1))

Debug.WriteLine(myInt)
Debug.WriteLine(MyDec)

Roger
Top Expert 2006

Commented:
Here's yet another method yielding the same results:

Dim ReadHours As Double = 1.89

Dim myDec As Decimal = ReadHours - CDec(myInt)

Commented:
It's cleaner to avoid strings.  For example a double holding a big number has a ToString that looks like "1E+15".  So splitting or parsing, as Sancler and ZeonFlash suggest, falls apart.

Commented:
mastoo, i guess you have a point there, i dont like the ToString method either.

i have devised this strategy relying on TimeSpan class, please may i have any thougts  on this technique, whether you think its viable or could return errors on occasion:

Private Function HoursToTicks(ByVal hours As Double) As ULong
Dim _CONSTANT As ULong = 36000000000   ' number of ticks in 1 hour
Return hours * _CONSTANT
End Function

Dim TotalTicks As ULong = HoursToTicks(ReadHours)
Dim ts As New TimeSpan(TotalTicks)

now i can use ts.Hours, ts.Minutes, etc and until now its giving correct results.
Commented:
I like it.  My only trivial point would be that you should use long instead of ULong as that is what the TimeSpan works with (and TotalTicks could be negative if you were looking at hours in the past).

Not the solution you were looking for? Getting a personalized solution is easy.

High School Computer Science, Computer Applications, Digital Design, and Mathematics Teacher
CERTIFIED EXPERT
Top Expert 2009
Commented:
I like the TimeSpan approach but would clean it up like so:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim myVal As Double = 1.89
Dim ts As TimeSpan = TimeSpanFromHours(myVal)
Debug.Print(ts.Hours)
Debug.Print(ts.Minutes)
End Sub

Private Function TimeSpanFromHours(ByVal hours As Double) As TimeSpan
Return New TimeSpan(hours * TimeSpan.TicksPerHour)
End Function

Commented:
thanks for the suggestion. im giving you the points anyway for your suggestions and the non string approach

Commented:
i just read Idle_Mind's post after i posted my comment. i love clean code! i hadnt idea the constants were already thought about and classified. im giving the points to mastoo and Idle_Mind\

thanks to all for your help
##### Thanks for using Experts Exchange.

• View three pieces of content (articles, solutions, posts, and videos)
• Ask the experts questions (counted toward content limit)
• Customize your dashboard and profile