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
Trả lời
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.
Aboslutely - cảm ơn vì đã chỉ ra điều đó. –
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ê. –
'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) –
Làm thế nào về điều này:
float f = 1.51; int i = (int) (f + 0.5);
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? –
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ố? –
nếu điều đó đúng, thì không nên i = f; chỉ hoạt động? –
(int)floor(f+0.5);
Hãy thử này ...
Để 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/ceil.3.html
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/floor.3.html
Cảm ơn lời giải thích tốt ... –
'(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). –
- 1. Làm thế nào để làm tròn gấp đôi số nguyên gần nhất và sau đó chuyển sang dạng phao?
- 2. Lua: chuyển đổi từ phao sang int
- 3. Làm tròn số nguyên xuống gần nhất
- 4. Số làm tròn đến khoảng cách gần nhất
- 5. Chuyển đổi phao sang int trong F #
- 6. Cách làm tròn một số nguyên lên hoặc xuống 10 gần nhất bằng cách sử dụng Javascript
- 7. Làm tròn Java BigDecimal đến khoảng cách gần nhất
- 8. Số thập phân/tăng gấp đôi thành số nguyên - làm tròn lên (không chỉ gần nhất)
- 9. Làm tròn phao cho yếu tố gần nhất?
- 10. Làm tròn số nguyên đến bội số gần nhất của 10
- 11. Làm tròn phao lên số nguyên tiếp theo trong javascript
- 12. javascript - làm thế nào để làm tròn đến số nguyên gần nhất
- 13. Làm tròn lên đến 0,05 gần nhất trong JavaScript
- 14. Chuyển đổi một đôi đến một int trong Javascript mà không làm tròn
- 15. Chuyển đổi phao sang bit
- 16. Làm thế nào để làm tròn một số thập phân đến phân số gần nhất?
- 17. Làm thế nào để chuyển đổi một phao sang một int trong Objective C?
- 18. Chuyển đổi một phao sang một chuỗi mà không làm tròn nó
- 19. JSON xâu chuỗi chuyển đổi phao sang int
- 20. Làm tròn một phao lên đến số nguyên tiếp theo trong mục tiêu C?
- 21. Chuyển đổi phao sang char *
- 22. làm tròn của NSdate đến giờ gần nhất trong iOS
- 23. Làm tròn đến 0,5 trong matlab gần nhất
- 24. SSE: chuyển đổi số nguyên ngắn thành phao
- 25. Chuyển đổi chuỗi thành số nguyên/phao trong Haskell?
- 26. cách thanh lịch nhất để chuyển đổi một byte đến một int trong Java
- 27. Haskell Chuyển đổi số nguyên thành Int?
- 28. Làm tròn lên hoặc xuống đến gần nhất 20
- 29. Phao nhanh để chuyển đổi int (truncate)
- 30. Số làm tròn đến gần 10 trong R
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)') –