2011-11-06 19 views
15

Potrzebuję podzielić podwójną wartość na dwie wartości typu int, jedną przed przecinkiem dziesiętnym i jedną po. Wartość int za kropką dziesiętną powinna mieć dwie cyfry.Podziel dwukrotnie na dwie int, jedną wartość przed przecinkiem i jedną po

Przykład:

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

Dostarczono więcej informacji, przepraszam za brak jasności. –

+0

Czy rzeczywiście potrzebujesz go w dwóch intach, czy potrzebujesz tylko wartości jako tekstu, z przecinkiem oddzielającym je? Ponieważ może powinieneś używać rozwiązania opartego na kulturze, zamiast "string.Split", większość ludzi sugeruje ... –

+0

Tak, potrzebuję ich w dwóch intach bez przecinka. –

Odpowiedz

23

ten sposób można to zrobić:

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

można podzielić ze sznurkiem, a następnie przekształcić int ...

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

Spróbuj:

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

W jakim języku programowania chcesz tego dokonać? Większość języka powinna mieć Modulo operator. Przykład C++:

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

Istnieje tag C# ... –

0

Możesz to zrobić bez przechodzenia przez łańcuchy. Przykład:

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

wyjściowa:

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

nie będą działać dla wielu jak -0.123, choć. Z drugiej strony nie jestem pewien, jak to pasuje do twojej reprezentacji.

13

Manipulowanie ciągami może być wolne. Spróbuj użyć następujących czynności:

double number; 

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

Myślę, że to najlepsza odpowiedź. –

+3

Może to pomóc, ale odpowiada na inne pytanie. "ułamkowa część" to "0.xxxx ...", a nie "xx". – Vlad

+0

Ustawiłeś mnie na właściwej drodze. Dzięki. – davidbates

2

innej odmianie, które nie pociąga za sobą ciąg manipulacji:

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

Upewnij się, że jesteś dziesiętne lub masz zwykły dziwne pływaka/podwójne zachowanie.

0

Właściwie to musiałem odpowiedzieć na to w prawdziwym świecie i podczas gdy odpowiedź Davida Samuela była częścią tego kodu, którego użyłem. Jak wcześniej powiedziałem Strings są zbyt dużo w górze. Musiałem wykonać te obliczenia na podstawie wartości pikseli w filmie i nadal byłem w stanie utrzymać 30 klatek na sekundę na umiarkowanym komputerze.

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* 

Służyło to do rozwiązania x, y z liczby pikseli w kanale wideo 640 X 480.

1

Ta funkcja zajmie dziesiętny czas i zamieni się z powrotem na bazę 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); 
} 

Zastosowanie:

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

użyciu LINQ. Po prostu wyjaśnienie odpowiedzi @Denis.

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

Co dalej?

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