109221793
109221793

Reputation: 16887

How can I round numbers up instead of down?

I'm performing some calculations and inserting the result into a database.

My problem is, that the answers I'm getting seem to be rounding down rather than up. This might not seem important but over the course of a lot of sales, the cents start adding up!!

Decimal pubCut = rrp * (percentageCutD / 100);
Decimal retCut = rrp * retailerCut;
Decimal edcut = rrp * edpercentage;

I'll be honest, I'm rubbish with figures and the whole Maths function was something I tried to avoid in college. Can anyone tell me how I can get these figures to round up as opposed to down?

Upvotes: 11

Views: 12243

Answers (4)

Martin Liversage
Martin Liversage

Reputation: 106826

Your incoming percentages probably don't add to 100 %. Compute one of your fractions by substracting the sum of the other fractions from the total.

var v = 100D;
var p1 = 33D/100;
var p2 = 33D/100;
var p3 = 33D/100;
var v1 = p1*v;
var v2 = p2*v;
var v3 = p3*v;
var sum = v1 + v2 + v3;

Unfortunately sum is 99 and not 100.

You can compute v3 like this instead:

var v3 = v - (v1 + v2);

Or better fix the rounding error in the incoming percentages:

Upvotes: 1

Øyvind Bråthen
Øyvind Bråthen

Reputation: 60694

Your problem is this

(percentageCutD / 100)

Since 100 is an int, it will perform integer division, so that 150/100 becomes 1. You can fix this by maksing sure that 100 is a decimal since you want a decimal as result in the end. Change your code to.

(percentageCutD / 100D)

However, if you always want to round values even like 1.1 up to 2, then you will have to use Math.Ceiling to accomplish this. If you for some reason want to avoid the Math class (I can't see why you want to do it, you can add 1 to the result and cast it to an int to effectively round up to the nearest integer.

Upvotes: 6

Homde
Homde

Reputation: 4286

.Net's Math.Round function uses something commonly referred to as banker's rounding which works by rounding .5 to the nearest even integer, ie 22.5 = 22 and 23.5 = 24. This gives a more even distribution when rounding.

It's also worth noting the SQL server doesn't use bankers rounding

Upvotes: 2

Liviu Mandras
Liviu Mandras

Reputation: 6617

Use Math.Ceiling() method.

double[] values = {7.03, 7.64, 0.12, -0.12, -7.1, -7.6};
Console.WriteLine("  Value          Ceiling          Floor\n");
foreach (double value in values)
   Console.WriteLine("{0,7} {1,16} {2,14}", 
                     value, Math.Ceiling(value), Math.Floor(value));
// The example displays the following output to the console:
//         Value          Ceiling          Floor
//       
//          7.03                8              7
//          7.64                8              7
//          0.12                1              0
//         -0.12                0             -1
//          -7.1               -7             -8
//          -7.6               -7             -8

Upvotes: 16

Related Questions