cómo sobre el uso de la función toString y luego se divide en el punto decimal, es decir:
poco de clase/método rápido para la prueba [editar]:
public class Test
{
public struct FractionSplit
{
public int BeforeDecimal;
public int AfterDecimal;
}
public FractionSplit SplitDecimal(decimal decimalValue,
int decimalPrecision = 2)
{
// now do the split - the apres decimal precision defined by
// the format function which defaults to 2 places i.e. "0.00"
string splitValue = decimalValue.ToString(string.Format("0.{0}",
new String('0', decimalPrecision)), CultureInfo.InvariantCulture);
string[] splitParts = splitValue.Split('.');
// now factor out derived splits as ints into struct
var fractionSplit = new FractionSplit
{
BeforeDecimal = int.Parse(splitParts[0]),
AfterDecimal = int.Parse(splitParts[1])
};
return fractionSplit;
}
}
uso:
Test test = new Test();
var result = test.SplitDecimal(12.1m);
según el comentario de Dan, esto ciertamente inferirá que 12.1 devuelve 12 y 10 como los enteros resultantes. ¿¿Es correcto?? - Quién sabe, pero cubre ese caso de uso por el momento. Esto se debe a la porción ToString ("0. {0}"), que por defecto agrega un '0' al final de cualquier porción decimal que solo tiene un dígito.
Un mejor enfoque puede ser no utilizar un decimal en absoluto, pero utiliza un '/' long' int' que representa "el valor de su utilización multiplicada por 100" . – Rawling
Tenga cuidado con los valores inusuales. El valor máximo para un decimal es ~ 7.9e28. El valor máximo para un int es ~ 2e9 (significativamente más pequeño). Incluso largo solo va a ~ 9e18. Entonces, si sabes que el valor siempre será> = 0, puedes usar un ulong que llega hasta ~ 18e18, lo que da un poco más de margen. – Davio
La siguiente respuesta de una pregunta similar puede satisfacer las necesidades de una parte fraccionada: http://stackoverflow.com/a/13038524/1178314 –