Ответ 1
Вид хакерского, но очень интуитивного способа сделать это:
var val = 96.154M;
var result = Math.Ceiling(val * 100) / 100.0M;
Учитывая десятичную '96.154 ', как я могу обеспечить, чтобы он всегда округлялся до 96.16 (в отличие от обычного округления до 2 десятичных знаков, которые дали бы 96.15).
Вид хакерского, но очень интуитивного способа сделать это:
var val = 96.154M;
var result = Math.Ceiling(val * 100) / 100.0M;
Вы можете добавить 0.005 к значению, а затем округлить результат.
Я думаю, что вы ищете метод Math.Ceiling
.
Вы можете комбинировать это с множителем, чтобы указать, сколько десятичных знаков округлить. Как это,
public float roundUp(float number, int numDecimalPlaces)
{
double multiplier = Math.Pow(10, numDecimalPlaces))
return Math.ceiling(number*multiplier) / multiplier;
}
Вот код метода roundUp для значения и базовой дроби. Базовая доля, которую вы должны использовать для вашего вопроса, равна 0,05 М. Однако этот метод может быть использован для другого общего сценария, который представляет собой базовую фракцию 0,5 М; И вы можете применить его интересными способами, например, используя базовую долю 0,3M. Ну, я надеюсь, что он должен ответить на ваши вопросы, повеселиться:
static decimal roundUp(decimal aValue, decimal aBaseFraction)
{
decimal quotient = aValue / aBaseFraction;
decimal roundedQuotient = Math.Round(quotient, 0);
decimal roundAdjust = 0.0M;
if (quotient > roundedQuotient)
{
roundAdjust = aBaseFraction;
}
return roundAdjust + roundedQuotient * aBaseFraction;
}
Вот моя версия метода RoundUp. В этом может быть определенная десятичная
void Main()
{
Console.WriteLine(RoundUp(2.8448M, 2));
//RoundUp(2.8448M, 2).Dump();
}
public static decimal RoundUp(decimal numero, int numDecimales)
{
decimal valorbase = Convert.ToDecimal(Math.Pow(10, numDecimales));
decimal resultado = Decimal.Round(numero * 1.00000000M, numDecimales + 1, MidpointRounding.AwayFromZero) * valorbase;
decimal valorResiduo = 10M * (resultado - Decimal.Truncate(resultado));
if (valorResiduo < 5)
{
return Decimal.Round(numero * 1.00M, numDecimales, MidpointRounding.AwayFromZero);
}
else
{
var ajuste = Convert.ToDecimal(Math.Pow(10, -(numDecimales + 1)));
numero += ajuste;
return Decimal.Round(numero * 1.00000000M, numDecimales, MidpointRounding.AwayFromZero);
}
}