2012-05-22 13 views
15

Estoy tratando de extraer las partes integrantes y fraccionada en un valor decimal (ambas partes deben ser números enteros):variables decimal Dividir en partes integrales y fracciones

decimal decimalValue = 12.34m; 
int integral = (int) decimal.Truncate(decimalValue); 
int fraction = (int) ((decimalValue - decimal.Truncate(decimalValue)) * 100); 

(para mi propósito, las variables decimales contendrá hasta hasta 2 decimales)

¿Hay alguna forma mejor de lograr esto?

+0

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

+0

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

+0

La siguiente respuesta de una pregunta similar puede satisfacer las necesidades de una parte fraccionada: http://stackoverflow.com/a/13038524/1178314 –

Respuesta

1

¿Qué tal:

int fraction = (int) ((decimalValue - integral) * 100); 
+0

No funcionará con números negativos. – SOReader

+1

¿Qué es "integral"? –

-1

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.

+0

0.1 dará el mismo resultado que 0,10 o 0,01 sin embargo? – Dan

+0

ashh-punto bueno !! prolly no, sin embargo, ¿no es 10 y 1 el resultado deseado? :) es decir, 12.10 daría 12 y 10, 12.01 daría 12 y 1. ¿no es así? –

+0

sí, pero ¿qué daría 12.1? Posiblemente 1 cuando el resultado deseado podría ser 10 ... No estoy seguro – Dan

2

Trate definición matemática:

var fraction = (int)(100.0m * (decimalValue - Math.Floor(decimalValue))); 

A pesar de que no es mejor en el sentido de rendimiento, pero al menos trabajo para los números negativos.

+0

Intente usar esto: var FileMinorPartClient = (int) (100.0m * (clientFileVersion - Math) .Floor (clientFileVersion))); Obtengo: "Operator '*' no se puede aplicar a operandos de tipo 'decimal' y 'double'" (clientFileVersion es un doble, a la 1.4) –

+1

@ B.ClayShannon Lo dice porque no puede mezclar esos dos . Cambie '100.0m' a' 100.0' o asegúrese de que 'decimalValue' sea de tipo' decimal' – SOReader

7
 decimal fraction = (decimal)2.78; 
     int iPart = (int)fraction; 
     decimal dPart = fraction % 1.0m; 
+0

Muy buen uso del operador de módulo en decimal. No esperaba que esto funcionara, pero funciona muy bien (y es rápido) :) –

3
decimal fraction = doubleNumber - Math.Floor(doubleNumber) 

o algo por el estilo.

1

Para sacar fracción puede utilizar this solution:

Math.ceil(((f < 1.0) ? f : (f % Math.floor(f))) * 10000) 
Cuestiones relacionadas