Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

Truncating a double into its integer and decimal parts.

Posted on 2006-10-26
9
Medium Priority
?
898 Views
Last Modified: 2008-01-09
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!!
0
Comment
Question by:newyuppie
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
9 Comments
 
LVL 21

Expert Comment

by:mastoo
ID: 17813571
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.
0
 
LVL 34

Expert Comment

by:Sancler
ID: 17813572
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
0
 
LVL 17

Expert Comment

by:ZeonFlash
ID: 17813811
Here's yet another method yielding the same results:

            Dim ReadHours As Double = 1.89

            Dim myInt As Integer = CInt(ReadHours.ToString.Substring(0, ReadHours.ToString.IndexOf(".")))
            Dim myDec As Decimal = ReadHours - CDec(myInt)
0
What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

 
LVL 21

Expert Comment

by:mastoo
ID: 17814029
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.
0
 
LVL 13

Author Comment

by:newyuppie
ID: 17814115
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.
0
 
LVL 21

Assisted Solution

by:mastoo
mastoo earned 1000 total points
ID: 17814273
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).
0
 
LVL 86

Accepted Solution

by:
Mike Tomlinson earned 1000 total points
ID: 17814292
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
0
 
LVL 13

Author Comment

by:newyuppie
ID: 17814338
thanks for the suggestion. im giving you the points anyway for your suggestions and the non string approach
0
 
LVL 13

Author Comment

by:newyuppie
ID: 17814365
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
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I think the Typed DataTable and Typed DataSet are very good options when working with data, but I don't like auto-generated code. First, I create an Abstract Class for my DataTables Common Code.  This class Inherits from DataTable. Also, it can …
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Video by: ITPro.TV
In this episode Don builds upon the troubleshooting techniques by demonstrating how to properly monitor a vSphere deployment to detect problems before they occur. He begins the show using tools found within the vSphere suite as ends the show demonst…
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
Suggested Courses

609 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question