2012-07-10 34 views
8

Tôi muốn biết nếu có một chức năng đơn giản mà tôi có thể sử dụng mẫu này. Tôi có mộtLàm tròn số phao trong mục tiêu-c

float value = 1.12345; 

tôi muốn làm tròn nó với gọi cái gì đó như

float value2 = [roundFloat value:value decimal:3]; 
NSLog(@"value2 = %f", value2); 

Và tôi nhận được "1,123" Có Library hoặc mặc định chức năng cho rằng hay tôi nên viết một khối mã cho loại tính toán này?

cảm ơn sự giúp đỡ của bạn trước

Trả lời

7

Sử dụng NSLog(@"%f", theFloat) luôn kết quả đầu ra sáu thập phân, ví dụ:

float theFloat = 1; 
NSLog(@"%f",theFloat); 

Output:

1.000000 

Nói cách khác, bạn sẽ không bao giờ có được 1.123 bằng cách sử dụng NSLog(@"%f", theFloat).

Cut-off sau ba thập phân:

float theFloat = 1.23456; 
float newFLoat = (int)(theFloat * 1000.0)/1000.0; 
NSLog(@"%f",newFLoat); 

Output:

1.234000 

Vòng ba thập phân (sử dụng roundf()/lroundf()/ceil()/floor()):

float theFloat = 1.23456; 
float newFLoat = (int)(roundf(theFloat * 1000.0))/1000.0; 
NSLog(@"%f",newFLoat); 

Output :

1.235000 

Vòng ba thập phân (cách bẩn):

float theFloat = 1.23456; 
NSString *theString = [NSString stringWithFormat:@"%.3f", theFloat]; 
float newFloat = [theString floatValue]; 
NSLog(@"%@",theString); 
NSLog(@"%f",newFloat); 

Output:

1.235 
1.235000 
+0

'% f' không xuất 6 số thập phân, nó _rounds_ đến 6 số thập phân. Giá trị dấu phẩy động thực sự không quá đẹp. – Sulthan

+0

Điều này chỉ hoạt động đối với các giá trị nhất định có biểu diễn chính xác dưới dạng phân số nhị phân.Nó không hoạt động trong hơn 90% các trường hợp. – EJP

-1

thử

#import <math.h> 

float cutFloat(float number, int decimal) { 
    number = number*(pow(10,decimal)); 
    number = (int)number; 
    number = number/(pow(10,decimal)) ; 

    return number; 
} 
+0

giải pháp này sẽ không làm tròn số . nó sẽ cắt nó đến vị trí thập phân cụ thể. – nfarshchi

+0

Và nó thậm chí sẽ không làm điều đó đúng trong hầu hết các trường hợp. – EJP

3

Đối in sử dụng giá trị:

NSLog(@"value2 = %.3f", value2);

Làm tròn đến 3 chữ số thập phân trước khi tính toán không thực sự có ý nghĩa vì float không phải là một con số chính xác. Ngay cả khi bạn làm tròn nó đến 1.123, nó sẽ là một cái gì đó như 1.122999999998.

Rules:

  1. Thông thường, bạn làm tròn lên chỉ để in kết quả - chuỗi định dạng có thể xử lý nó (xem ở trên).
  2. Để tính toán chính xác (ví dụ: tiền tệ), không sử dụng dấu phẩy động, sử dụng NSDecimalNumber hoặc điểm số điểm cố định.
+0

Cảm ơn sự giúp đỡ của bạn nhưng trong mẫu này tôi nên sử dụng 'float' và cũng có bất kỳ số thập phân thêm nào sẽ làm cho một số sai lầm trong tính toán cụ thể của tôi. nhưng cảm ơn sự giúp đỡ của bạn cũng – nfarshchi

+0

Tôi đã thử NSDecimalNumber và điều đó cũng tuyệt vời. cảm ơn cho đề xuất của bạn. +1 – nfarshchi

+1

@nfarshchi Tuyên bố đó là một mâu thuẫn về mặt ngữ nghĩa. * Hoặc là * bạn phải sử dụng float * hoặc * bạn phải có một số vị trí thập phân cụ thể. Bạn * không thể * có cả hai: nó là một thuật toán không thể. – EJP

0

Lưu ý rằng "Round" không nhất thiết phải là đơn giản một chủ đề như bạn nghĩ. Ví dụ:

DIY Calculator: Rounding Algorithms 101 liệt kê 16 phương pháp khác nhau để làm tròn số.

Wikipedia:Rounding bao gồm rất nhiều cùng một khu đất

Và Cplusplus có mã nguồn cho một loạt các Rounding Algorithms được dễ dàng thể dịch để Objective-C

Làm thế nào bạn muốn làm tròn sẽ phụ thuộc vào bối cảnh những gì bạn đang làm với dữ liệu.

Và tôi phải chỉ ra rằng Stack Overflow đã có một số điểm plethora of other questions about rounding in objective-c

1

Floating không có chữ số thập phân, họ có nơi nhị phân. Số thập phân-thập phân có số thập phân. Bạn không thể làm tròn số dấu phẩy động với số thập phân cụ thể trừ khi bạn chuyển đổi thành một số thập phân. Không có thường trình, phương thức, hàm, v.v., mà trả về một giá trị dấu phẩy động có thể thực hiện tác vụ này.

0
//Your Number to Round (can be predefined or whatever you need it to be) 
float numberToRound = 1.12345; 

float min = ([ [[NSString alloc]initWithFormat:@"%.0f",numberToRound] floatValue]); 
float max = min + 1; 
float maxdif = max - numberToRound; 
if (maxdif > .5) { 
    numberToRound = min; 
}else{ 
    numberToRound = max; 
} 

//numberToRound will now equal it's closest whole number (in this case, it's 1) 
0

Đây là một cách đơn giản để làm điều đó:

float numberToRound = 1.12345f; 
float remainder = numberToRound*1000.0f - (float)((int)(numberToRound*1000.0f)); 

if (remainder >= 0.5f) { 
    numberToRound = (float)((int)(numberToRound*1000.0f) + 1)/1000.0f; 
} 
else { 
    numberToRound = (float)((int)(numberToRound*1000.0f))/1000.0f; 
} 

Đối với một số thập phân tùy ý, thay 1000.0f trong đoạn mã trên với

float mult = powf(10.0f, decimal); 
Các vấn đề liên quan