2011-11-06 33 views
15

Tôi cần chia một giá trị kép thành hai giá trị int, một trước dấu thập phân và một sau. Int sau dấu thập phân phải có hai chữ số.Chia đôi thành hai int, một int trước dấu thập phân và một sau

Ví dụ:

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

Cung cấp thêm thông tin, xin lỗi vì không rõ ràng. –

+0

Bạn có thực sự cần nó trong hai int, hoặc bạn chỉ cần các giá trị như văn bản, với một dấu phẩy tách chúng? Bởi vì có lẽ bạn nên sử dụng một giải pháp dựa trên văn hóa thay vì 'string.Split' hầu hết mọi người đang gợi ý ... –

+0

Có tôi cần chúng trong hai int mà không có dấu phẩy. –

Trả lời

23

Đây là cách bạn có thể làm điều đó:

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

bạn có thể chia tay với chuỗi và sau đó chuyển đổi thành int ...

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

Hãy thử:

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

Ngôn ngữ lập trình nào bạn muốn sử dụng để thực hiện việc này? Hầu hết ngôn ngữ nên có một Modulo operator. Ví dụ C++:

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

Có thẻ C# ... –

0

Bạn có thể làm điều đó mà không cần phải thực hiện chuỗi. Ví dụ:

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

Output:

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

Sẽ không làm việc cho một số mặt hàng như -0.123, mặc dù. Sau đó, một lần nữa, tôi không chắc làm thế nào nó sẽ phù hợp với đại diện của bạn.

13

Thao tác chuỗi có thể bị chậm. Hãy thử sử dụng như sau:

double number; 

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

Tôi nghĩ đây là câu trả lời hay nhất. –

+3

Nó có thể hữu ích, nhưng nó trả lời một câu hỏi khác. 'fractionalPart' là' 0.xxxx ... ', không phải' xx'. – Vlad

+0

Bạn đã cho tôi bắt đầu trên con đường bên phải. Cảm ơn. – davidbates

2

Một biến thể mà không liên quan đến chuỗi các thao tác:

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

Hãy chắc chắn rằng họ đang thập phân hoặc bạn nhận được phao lạ/hành vi đôi bình thường.

0

Tôi thực sự chỉ phải trả lời điều này trong thế giới thực và trong khi câu trả lời của @David Samuel đã làm một phần của nó ở đây là mã kết quả tôi đã sử dụng. Như đã nói trước khi Strings là quá nhiều chi phí. Tôi đã phải tính toán này qua các giá trị pixel trong một video và vẫn có thể duy trì 30fps trên một máy tính vừa phải.

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* 

Điều này được sử dụng để giải quyết x, y từ số pixel trong nguồn cấp dữ liệu video 640 X 480.

1

Chức năng này sẽ mất thời gian theo số thập phân và chuyển trở lại thành cơ số 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); 
} 

Cách sử dụng:

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

Sử dụng LINQ. Chỉ cần làm rõ câu trả lời @Denis.

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

thì sao?

var n = 1004.522 
var a = Math.Floor(n); 
var b = n - a; 
Các vấn đề liên quan