How to round down in VB?

What is the best way to round down a number?
joesmowAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Ryan ChongBusiness Systems Analyst , ex-Senior Application EngineerCommented:
do while Conditon
   i = i - j
loop
0
AzraSoundCommented:
Int(number) will return just the integer portion...
or
Fix(number)

they differ in how they round negative numbers (if thats an issue for you)
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Ryan ChongBusiness Systems Analyst , ex-Senior Application EngineerCommented:
Oops..
0
Big Business Goals? Which KPIs Will Help You

The most successful MSPs rely on metrics – known as key performance indicators (KPIs) – for making informed decisions that help their businesses thrive, rather than just survive. This eBook provides an overview of the most important KPIs used by top MSPs.

ArkCommented:
Debug.Print Format(5459.455, "##,##0.00")

For more information place cursor on 'Format' word and press F1.

Cheers
0
nilapennCommented:
use the found function

for (eg)

round(45.34,2)=45
round(45.55)=46
roudn(45.55,1)=45.6
0
inthedarkCommented:
Warning Round has some strange bugs:

If you enter an immediate window and you type:
 
?round(0.5,0)

The .5 should round up to 1 but it produces a result of  0

Scratch head..............then try

?round(.95,1)

But in this case the .05 correctly rounds up.

I am not qualified to pass judgement on Microsoft's QA procedures.  The problems stem from how numerics are internally represented.

I would therefore suggest that you should not used either Round, Fix or Int. You should create your own function so that at some time in the future, if some smartypants find a problem with your rounding function you only have one place to change.

The following function will provide accurate results for financial applications.  Roundings for both negative and positive numbers are consistent. Which means that credit notes will always have the same total value as invoices.

Public Function Rounder(Value, DecimalPlaces As Integer)

Public Function Rounder(Value, DecimalPlaces As Integer)
If DecimalPlaces <= 4 Then
    Rounder = (Int(Abs(Value) * (10 ^ DecimalPlaces) + 0.50001) * (10 ^ -DecimalPlaces)) * Sgn(Value)
Else
    Rounder = (Int(Abs(Value) * (10 ^ DecimalPlaces) + (0.5 + (10 ^ (-DecimalPlaces - 2))))) * (10 ^ -DecimalPlaces) * Sgn(Value)
End If
End Function

Hope this helps, inthedark.
0
inthedarkCommented:
Warning Round has some strange bugs:

If you enter an immediate window and you type:
 
?round(0.5,0)

The .5 should round up to 1 but it produces a result of  0

Scratch head..............then try

?round(.95,1)

But in this case the .05 correctly rounds up.

I am not qualified to pass judgement on Microsoft's QA procedures.  The problems stem from how numerics are internally represented.

I would therefore suggest that you should not used either Round, Fix or Int. You should create your own function so that at some time in the future, if some smartypants find a problem with your rounding function you only have one place to change.

The following function will provide accurate results for financial applications.  Roundings for both negative and positive numbers are consistent. Which means that credit notes will always have the same total value as invoices.

Public Function Rounder(Value, DecimalPlaces As Integer)

Public Function Rounder(Value, DecimalPlaces As Integer)
If DecimalPlaces <= 4 Then
    Rounder = (Int(Abs(Value) * (10 ^ DecimalPlaces) + 0.50001) * (10 ^ -DecimalPlaces)) * Sgn(Value)
Else
    Rounder = (Int(Abs(Value) * (10 ^ DecimalPlaces) + (0.5 + (10 ^ (-DecimalPlaces - 2))))) * (10 ^ -DecimalPlaces) * Sgn(Value)
End If
End Function

Hope this helps, inthedark.
0
rspahitzCommented:
But inthedark, you say, "I would ... suggest ... not [using]... Int"

then your code uses "int":

   Rounder = (Int(Abs(Value) * (10 ^ DecimalPlaces) + 0.50001) * (10 ^ -DecimalPlaces)) * Sgn(Value)

Granted, there is really no other practical way to truncate a value's integer.  You could convert to string, find the decimal, then remove it and convert back to numeric, but that seems like a silly way.

--
Basically, the functions you mention have problems with the decimal portion, so one way to deal with this is to "convert" to a larger scaled number:

Instead of int(123.5), you can try int((123.5*10-9)/10) which scales it to an integer, subtracts a rounding value (always in 9s), then scales back and removes the decimal portion.  I don't know if this has the same decimal-to-binary-to-decimal conversion problems, but they may be more limited.

Personally, I think it's overkill except for the most critical of applications, and I'd simply use Int(x).
0
inthedarkCommented:
rspahitz, you are quite right I used Int. I only posted my comment as I read that somebody else had suggested using the Round function. The points that I was trying to make: keep control - always use your own function for rounding so that you can future-proof your application against changes in Microsoft's current interpretation of rounding. And that I wouldn't like a VB newbie reading this to think that rounding was a simple subject.

AzraSound has already answered the question which was "What is the best way to round down a number?"
0
rspahitzCommented:
Yes.  I think most of the other posts before mine addressed the issue, and you're quite right about the rounding issue.  And AzraSound has the simplest (and first) solution that will probably work.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.