No creo que haya nada incorporado para eso, porque es un requisito bastante inusual (por ejemplo, la idea de que 1.3358 está más cerca de 1.33 que de 1.34 es impar). Tu código parece razonablemente apropiado.
EDIT: No se puede utilizar MidpointRounding
para conseguir el efecto que usted quiere aquí, debido a que el punto en el que se inicia redondeo no es el punto medio - es (digamos) de 1,336 en lugar de la normal de 1.335. Solo 1.335 se trata como el punto medio entre 1.33 y 1.34, porque ese es el punto medio. Efectivamente has obtenido un redondeo sesgado aquí de una manera inusual.
Ni siquiera puede truncar a tres DP y luego usar MidpointRounding
, ya que no hay modo "hacia cero".
Una opción poco extraño sería llevar a cabo con eficacia la tendencia a sí mismo:
private static decimal CustomRound(decimal x)
{
return decimal.Round(x - 0.001m, 2, MidpointRounding.AwayFromZero);
}
por lo que sería tratar 82.3657 82.3647 y tan redonda que a 82.36; trataría 82.3667 y 82.3657 y lo redondeará a 82.37, y trataría 82.5967 como 82.5957 y lo redondeará a 82.60 etc. I piensa que hace lo que quiere, pero solo para valores positivos. Tendría que averiguar exactamente qué comportamiento desea para los valores negativos.
Haga lo que haga, es necesario documentar muy claramente :)
Así como una cuestión de preferencia, me gustaría utilizar en lugar de decimal.Truncate
Math.Truncate
, sólo para hacerlo más claro que todo lo que realmente se hace con decimales.
@Downvoter: ¿me gustaría comentar? –
Sí, he tenido problemas para tratar de usar métodos integrados. Gracias. – redzon