I have tried using Math.Round and MidpointRounding. This does not appear to do what I need.
Example:
52.34567 rounded to 2 decimals UP = 52.35
1.183 rounded to 2 decimals DOWN = 1.18
Do I need to write a custom function?
Sometimes I need a number like 23.567 to round DOWN to 23.56.
In this scenario…
Math.Round(dec, 2, MidpointRounding.AwayFromZero) gives 23.57
Math.Round(dec, 2, MidpointRounding.ToEven) gives 23.57
Decimals up to 9 decimal places could come out and need to be rounded to 1, 2, 3 or even 4 decimal places.
Try using decimal.Round():
Where
xis your value and 2 is the number of decimals you wish to keep.You can also specify whether .5 rounds up or down by passing third parameter:
EDIT:
In light of the new requirement (i.e. that numbers are sometimes rounded down despite being greater than “halfway” to the next interval), you can try:
Truncate() lops off the non-integer portion of the decimal. Note that
numDigitsabove should be how many digits you want to KEEP, not the total number of decimals, etc.Finally, if you want to force a round up (truncation really is a forced round-down), you would just add 1 to the result of the
Truncate()call before dividing again.