Percent of change calculation VB.NET

Posted on 2010-11-12
Last Modified: 2012-05-10
Attached is a screenshot of what should seemingly be a simple piece of code. I am attempting to calculate percent of change and avoid a divide by zero.....My code to get around the zero works, however i am getting the wrong answers with what i thought to be the base calculation
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Function CalcPercent(ByVal NewVal As Integer, ByVal OldVal As Integer) As Decimal

        If NewVal = 0 And OldVal > 0 Then
            CalcPercent = -100
            Exit Function
        End If

        If NewVal > 0 And OldVal = 0 Then
            CalcPercent = 100
            Exit Function
        End If

        If NewVal = 0 And OldVal = 0 Then
            CalcPercent = 0
            Exit Function
        End If

        CalcPercent = (NewVal - OldVal) / OldVal * 100

    End Function
    Private Sub TestCalc()
        Dim myConnection As SqlConnection
        Dim myCommand As SqlCommand
        Dim myReader As SqlDataReader
        Dim prm As SqlParameter
        Dim NEWVALUE As Integer
        Dim OLDVALUE As Integer
        Dim EXPECTED As String
            myConnection = New SqlConnection(ConfigurationSettings.AppSettings("connectionString"))
            myCommand = New SqlCommand("TestPercentCalcsRTN", myConnection)
            myCommand.CommandType = CommandType.StoredProcedure

            myReader = myCommand.ExecuteReader()

            While myReader.Read
                OLDVALUE = myReader("OLDVALUE")
                NEWVALUE = myReader("NEWVALUE")
                EXPECTED = myReader("EXPECTED")
                Response.Write("OLDVALUE : " + Right("_____________" + Str(OLDVALUE), 10) + "   ")
                Response.Write("NEWVALUE : " + Right("_____________" + Str(NEWVALUE), 10) + "   ")
                Response.Write("CALCULATED : " + Right("_____________" + Str(CalcPercent(NEWVALUE, OLDVALUE)), 10))
                Response.Write("____EXPECTED : " + Right("_____________" + EXPECTED, 10) + "   " + "  <BR> ")
            End While

        Catch ex As Exception


            If Not myReader Is Nothing Then
                myReader = Nothing
            End If

            If Not myConnection Is Nothing Then
            End If

        End Try
    End Sub

Open in new window

Question by:shelbyinfotech
  • 6
  • 2
LVL 37

Expert Comment

ID: 34123126
You just want
CalcPercent = NewVal/OldVal * 100
LVL 37

Expert Comment

ID: 34123132
Actually, I think you are a little confused. You are getting the percentage increase currently. Going from 50 to 100 is a 100% increase.
LVL 37

Expert Comment

ID: 34123174
Your data is correct, your expectations are wrong.
You don't need
        If NewVal = 0 And OldVal > 0 Then
            CalcPercent = -100
            Exit Function
        End If

It will do that automatically.

        If NewVal > 0 And OldVal = 0 Then
            CalcPercent = 100
            Exit Function
        End If

This shouldn't be 100, it should be infinite. Maybe you should use 99999 or something to make the ouput more indicative of the actual result.
Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

LVL 37

Expert Comment

ID: 34123183
So ignore my first post. That will give you what the new value is as a percent of the old value.  Your original formula gives you the percentage change.

Author Comment

ID: 34123269
Case 1 is not giving me -5%
LVL 37

Expert Comment

ID: 34123328
Case 1 should not give you 5% If you want from 100% to 95%, that would be a 5% decrease.

When you go from 105% to 100% you are dropping 5 of the 105 so 5/105 is the correct drop amount. Converted to a percent gives 4.76% and some change, just like it is showing.
LVL 37

Accepted Solution

TommySzalapski earned 500 total points
ID: 34123387
You do have a formatting issue though.
Try this
CalcPercent = Round((NewVal - OldVal) / OldVal * 100,2)

Author Closing Comment

ID: 34123795

Featured Post

Microsoft Certification Exam 74-409

Veeam® is happy to provide the Microsoft community with a study guide prepared by MVP and MCT, Orin Thomas. This guide will take you through each of the exam objectives, helping you to prepare for and pass the examination.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Allow User To Arrange Columns At Datagridview 3 24
Help with AsEnumerable(), LINQ 4 39
Crystal reports 2 40 Move a class from Solution Items to a project 2 22
Since .Net 2.0, Visual Basic has made it easy to create a splash screen and set it via the "Splash Screen" drop down in the Project Properties.  A splash screen set in this manner is automatically created, displayed and closed by the framework itsel…
Introduction As chip makers focus on adding processor cores over increasing clock speed, developers need to utilize the features of modern CPUs.  One of the ways we can do this is by implementing parallel algorithms in our software.   One recent…
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …
This tutorial gives a high-level tour of the interface of Marketo (a marketing automation tool to help businesses track and engage prospective customers and drive them to purchase). You will see the main areas including Marketing Activities, Design …

770 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