2011-11-06 9 views
15

Ho bisogno di dividere un doppio valore, in due valori int, uno prima del punto decimale e uno dopo. L'int dopo il punto decimale dovrebbe avere due cifre.Dividi il doppio in due int, un int prima del punto decimale e uno dopo

Esempio:

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

Fornito maggiori informazioni, mi dispiace per non essere chiaro. –

+0

Hai davvero bisogno che sia in due o hai solo bisogno dei valori come testo, con una virgola che li separa? Perché forse dovresti usare una soluzione basata sulla cultura invece del 'string.Split 'che la maggior parte delle persone suggerisce ... –

+0

Sì, ne ho bisogno in due interi senza la virgola. –

risposta

23

Questo è come si potesse fare:

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

è possibile dividere con lo spago e poi convertire in int ...

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

Prova:

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

Quale linguaggio di programmazione si desidera utilizzare per eseguire questa operazione? La maggior parte della lingua dovrebbe avere un Modulo operator. Esempio C++:

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

C'è un tag C# ... –

0

È possibile farlo senza passare attraverso le stringhe. Esempio:

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+")"); 
} 

uscita:

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

non funziona per un numero come -0.123, però. Poi di nuovo, non sono sicuro di come si adatti alla tua rappresentazione.

13

La manipolazione delle stringhe può essere lenta. Provare a utilizzare il seguente:

double number; 

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

Penso che questa sia la migliore risposta. –

+3

Potrebbe essere d'aiuto, ma risponde a una domanda diversa. 'fractionalPart' è' 0.xxxx ... ', non' xx'. – Vlad

+0

Mi hai avviato sulla strada giusta. Grazie. – davidbates

2

Un'altra variante che non comporta la manipolazione di stringhe:

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(); 
} 

assicurarsi che siano decimali o si ottiene la solita strana galleggiante doppio comportamento /.

0

In realtà dovevo solo rispondere nel mondo reale e mentre la risposta di @David Samuel ha fatto parte di questo è il codice risultante che ho usato. Come detto prima, le stringhe sono troppe. Ho dovuto fare questo calcolo attraverso i valori dei pixel in un video ed ero ancora in grado di mantenere 30fps su un computer moderato.

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* 

Questo è stato utilizzato per risolvere x, y dal numero di pixel nel video di 640 X 480.

1

Questa funzione impiegherà del tempo in decimale e tornerà alla 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); 
} 

Usage:

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

utilizzando LINQ. Solo un chiarimento della risposta di @Denis.

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

che ne dici?

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