2011-11-06 12 views
15

Necesito dividir un valor doble, en dos valores int, uno antes del punto decimal y uno después. El int después del punto decimal debe tener dos dígitos.Dividir el doble en dos int, un int antes del punto decimal y uno después de

Ejemplo:

10.50 = 10 and 50 
    10.45 = 10 and 45 
    10.5 = 10 and 50 
+0

Proporcionado más información, disculpa por no ser claro. –

+0

¿Realmente necesita que esté en dos entradas, o simplemente necesita los valores como texto, con una coma que los separa? Porque tal vez deberías estar usando una solución basada en la cultura en lugar de 'string.Split', la mayoría de la gente está sugiriendo ... –

+0

Sí, los necesito en dos partes sin la coma. –

Respuesta

23

Ésta es la forma en que podría hacerlo:

string s = inputValue.ToString("0.00", CultureInfo.InvariantCulture); 
string[] parts = s.Split('.'); 
int i1 = int.Parse(parts[0]); 
int i2 = int.Parse(parts[1]); 
1

puede dividir con una cuerda y luego convertir en int ...

string s = input.ToString(); 
string[] parts = s.Split('.'); 
0

Probar:

string s = "10.5"; 
string[] s1 = s.Split(new char[] { "." }); 
string first = s1[0]; 
string second = s1[1]; 
7

¿Qué lenguaje de programación desea utilizar para hacer esto? La mayoría del lenguaje debe tener un Modulo operator. Ejemplo de C++:

double num = 10.5; 
int remainder = num % 1 
+4

Hay una etiqueta C# ... –

0

Puede hacerlo sin pasar por las cadenas. Ejemplo:

foreach (double x in new double[]{10.45, 10.50, 10.999, -10.323, -10.326, 10}){ 
    int i = (int)Math.Truncate(x); 
    int f = (int)Math.Round(100*Math.Abs(x-i)); 
    if (f==100){ f=0; i+=(x<0)?-1:1; } 
    Console.WriteLine("("+i+", "+f+")"); 
} 

Salida:

(10, 45) 
(10, 50) 
(11, 0) 
(-10, 32) 
(-10, 33) 
(10, 0) 

no funcionará para un número como -0.123, sin embargo. Por otra parte, no estoy seguro de cómo se ajustaría a su representación.

13

La manipulación de cadenas puede ser lenta. Trate de usar la siguiente:

double number; 

long intPart = (long) number; 
double fractionalPart = number - intPart; 
+0

Creo que esta es la mejor respuesta. –

+3

Puede ser útil, pero responde una pregunta diferente. 'fractionalPart' es' 0.xxxx ... ', no' xx'. – Vlad

+0

Me pusiste en el camino correcto. Gracias. – davidbates

2

Otra variación que no implique la manipulación de cadenas:

static void Main(string[] args) 
{ 
    decimal number = 10123.51m; 
    int whole = (int)number; 
    decimal precision = (number - whole) * 100; 

    Console.WriteLine(number); 
    Console.WriteLine(whole); 
    Console.WriteLine("{0} and {1}",whole,(int) precision); 
    Console.Read(); 
} 

asegurarse de que estén o decimales se obtiene el extraño flotador/doble comportamiento habitual.

0

De hecho, tuve que responder a esto en el mundo real y mientras que la respuesta de @David Samuel hizo parte de esto aquí es el código resultante que utilicé. Como se dijo antes, las cuerdas son demasiado generales. Tuve que hacer este cálculo a través de los valores de píxel en un video y todavía podía mantener 30 fps en una computadora moderada.

double number = 4140/640; //result is 6.46875 for example 

int intPart = (int)number; //just convert to int, loose the dec. 
int fractionalPart = (int)((position - intPart) * 1000); //rounding was not needed. 
//this procedure will create two variables used to extract [iii*].[iii]* from iii*.iii* 

Esto se utilizó para resolver x, y del número de píxeles en la alimentación de 640 x 480 de vídeo.

1

Esta función tomará tiempo en decimales y se convertirá nuevamente en la base 60.

public string Time_In_Absolute(double time) 
    { 
     time = Math.Round(time, 2); 
     string[] timeparts = time.ToString().Split('.');       
     timeparts[1] = "." + timeparts[1]; 
     double Minutes = double.Parse(timeparts[1]);    
     Minutes = Math.Round(Minutes, 2); 
     Minutes = Minutes * (double)60; 
     return string.Format("{0:00}:{1:00}",timeparts[0],Minutes); 
     //return Hours.ToString() + ":" + Math.Round(Minutes,0).ToString(); 
    } 
3
"10.50".Split('.').Select(int.Parse); 
3
/// <summary> 
/// Get the integral and floating point portions of a Double 
/// as separate integer values, where the floating point value is 
/// raised to the specified power of ten, given by 'places'. 
/// </summary> 
public static void Split(Double value, Int32 places, out Int32 left, out Int32 right) 
{ 
    left = (Int32)Math.Truncate(value); 
    right = (Int32)((value - left) * Math.Pow(10, places)); 
} 

public static void Split(Double value, out Int32 left, out Int32 right) 
{ 
    Split(value, 1, out left, out right); 
} 

Uso:

Int32 left, right; 

Split(10.50, out left, out right); 
// left == 10 
// right == 5 

Split(10.50, 2, out left, out right); 
// left == 10 
// right == 50 

Split(10.50, 5, out left, out right); 
// left == 10 
// right == 50000 
0

El uso de LINQ. Solo aclaración de la respuesta de @Denis.

var splt = "10.50".Split('.').Select(int.Parse); 
int i1 = splt.ElementAt(0); 
int i2 = splt.ElementAt(2); 
0

¿qué tal?

var n = 1004.522 
var a = Math.Floor(n); 
var b = n - a; 
Cuestiones relacionadas