Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Round a decimal to the nearest quarter in C#

Is there a simple way in c# to round a decimal to the nearest quarter i.e. x.0, x.25, x.50 x.75 for example 0.21 would round to 0.25, 5.03 would round to 5.0

Thanks in advance for any help.

like image 228
bplus Avatar asked May 13 '10 11:05

bplus


People also ask

How do you round to the nearest decimal in C#?

Round() Method in C# The Decimal. Round() method in C# is used to round a value to the nearest integer or specified number of decimal places.

How do you round up C sharp?

Round() function can be used to round up a double value to the nearest integer value in C#. The Math. Round() function returns a double value that is rounded up to the nearest integer.

What does it mean to round to the nearest quarter?

If it is 7 minutes till the hour it rounds to, say, 8:00 am; if it is 10 till it rounds to 7:45. If it is 7 minutes after it would be 8:00, and 8 minutes after would be 8:15 am. In other words, whatever time is entered needs to be rounded to the nearest quarter hour.


2 Answers

Multiply it by four, round it as you need to an integer, then divide it by four again:

x = Math.Round (x * 4, MidpointRounding.ToEven) / 4;

The various options for rounding, and their explanations, can be found in this excellent answer here :-)

like image 101
paxdiablo Avatar answered Sep 23 '22 04:09

paxdiablo


Alternatively, you can use UltimateRoundingFunction given in this blog: http://rajputyh.blogspot.in/2014/09/the-ultimate-rounding-function.html

//amountToRound => input amount
//nearestOf => .25 if round to quater, 0.01 for rounding to 1 cent, 1 for rounding to $1
//fairness => btween 0 to 0.9999999___.
//            0 means floor and 0.99999... means ceiling. But for ceiling, I would recommend, Math.Ceiling
//            0.5 = Standard Rounding function. It will round up the border case. i.e. 1.5 to 2 and not 1.
//            0.4999999... non-standard rounding function. Where border case is rounded down. i.e. 1.5 to 1 and not 2.
//            0.75 means first 75% values will be rounded down, rest 25% value will be rounded up.
decimal UltimateRoundingFunction(decimal amountToRound, decimal nearstOf, decimal fairness)
{
    return Math.Floor(amountToRound / nearstOf + fairness) * nearstOf;
}

Call below for standard rounding. i.e. 1.125 will be rounded to 1.25

UltimateRoundingFunction(amountToRound, 0.25m, 0.5m);

Call below for rounding down border values. i.e. 1.125 will be rounded to 1.00

UltimateRoundingFunction(amountToRound, 0.25m, 0.4999999999999999m);

So called "Banker's Rounding" is not possible with UltimateRoundingFunction, you have to go with paxdiablo's answer for that support :)

like image 30
Yogee Avatar answered Sep 22 '22 04:09

Yogee