2010-01-10 45 views
23

Có cách nào để chuyển đổi một float thành một số Int bằng cách làm tròn số nguyên gần nhất có thể không?Cách chuyển đổi một phao sang Int bằng cách làm tròn đến số nguyên gần nhất

+0

Xem thêm [a gần đây '[C++]' Q & A] (http://stackoverflow.com/questions/37620659/merit-of-inline-asm-rounding-via-putting-float-into-int-variable/37624488#37624488) f hoặc những gì thực sự biên dịch thành mã nhanh ('lrintf (x)' hoặc '(int) nearbyintf (x)') –

Trả lời

26

Thực ra câu trả lời Paul Beckingham là không hoàn toàn chính xác. Nếu bạn thử một số âm như -1.51, bạn nhận được -1 thay vì -2.

Các hàm tròn(), roundf(), lround() và lroundf() từ công việc math.h cho các số âm.

+0

Aboslutely - cảm ơn vì đã chỉ ra điều đó. –

+0

Làm tròn là một trong những điều bạn có thể tranh luận với người khác trong nhiều giờ. Ngoài ra còn có một trường tư tưởng cho biết "thêm một nửa và giảm phần phân số" thành kiến ​​các kết quả đầu ra lên trên (vì 'k + 0' không thay đổi và' k + 0,5' luôn tăng lên cho một số nguyên nhất định 'k'), do đó, họ khuyên bạn nên làm tròn thậm chí một nửa xuống và nửa lẻ lên (tức là 'k + 0.5' vòng thành' k' cho 'k' = ..., -4, -2, 0, 2, 4, ... và nó làm tròn thành 'k + 1' cho' k' = ..., -3, -1, 1, 3, ...). Về cơ bản, cách ngây thơ có thể làm giảm số liệu thống kê. –

+0

'vòng()' có các ngữ nghĩa làm tròn không chuẩn: các trường hợp nửa chừng cách xa 0. [** Lựa chọn tốt nhất thường là 'nearbyint()' (hoặc 'nearbyintf' /' l') **] (http://en.cppreference.com/w/c/numeric/math/nearbyint), bởi vì nó có thể được thực hiện với một lệnh máy đơn trên CPU x86 với SSE4.1. (Hoặc với SSE1 để chuyển đổi thành 'int' hoặc' long' cùng một lúc). ('rint' là tương tự, nhưng nó cần thiết để nâng cao ngoại lệ FP" không chính xác "khi kết quả không giống như đầu vào.) [Ngay cả với' -ffast-math', 'round()' không inline .] (https://godbolt.org/g/51eXsy) –

3

Làm thế nào về điều này:

 
float f = 1.51; 
int i = (int) (f + 0.5); 
+0

nó hoạt động. Nhưng bằng cách nào? không nên int là 2.01? sau đó làm thế nào để int đi xuống? –

+0

Một số nguyên theo định nghĩa một số nguyên, vậy làm sao nó có thể có giá trị phân số? –

+0

nếu điều đó đúng, thì không nên i = f; chỉ hoạt động? –

57

Để tròn đến roundf sử dụng gần nhất(), để làm tròn lên sử dụng ceilf(), để làm tròn xuống sử dụng floorf(). Hy vọng rằng ví dụ này chứng tỏ ...

#import "math.h" 

... 

float numberToRound; 
int result; 

numberToRound = 4.51; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(4.510000) = 5 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(4.510000) = 5 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(4.510000) = 4 


numberToRound = 10.49; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(10.490000) = 10 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(10.490000) = 11 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(10.490000) = 10 


numberToRound = -2.49; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(-2.490000) = -2 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(-2.490000) = -2 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(-2.490000) = -3 

numberToRound = -3.51; 

result = (int)roundf(numberToRound); 
NSLog(@"roundf(%f) = %d", numberToRound, result); // roundf(-3.510000) = -4 

result = (int)ceilf(numberToRound); 
NSLog(@"ceilf(%f) = %d", numberToRound, result); // ceilf(-3.510000) = -3 

result = (int)floorf(numberToRound); 
NSLog(@"floorf(%f) = %d", numberToRound, result); // floorf(-3.510000) = -4 

Các tài liệu ...

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/roundf.3.html

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/ceil.3.html

https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/floor.3.html

+0

Cảm ơn lời giải thích tốt ... –

+0

'(int) nearbyintf (x)' biên dịch thành tốt hơn asm trên x86, bởi vì nó sử dụng chế độ làm tròn hiện tại thay vì chế độ làm tròn cố định (với một quirk mà x86 không hỗ trợ phần cứng). –

Các vấn đề liên quan