19

Các kỹ thuật khác nhau được sử dụng để chuyển đổi loại dữ liệu phao thành số nguyên trong C++ là gì?Điểm nổi bật C++ cho các chuyển đổi loại số nguyên

#include<iostream> 
using namespace std; 
struct database 
{ 
    int id,age; 
    float salary; 
}; 
int main() 
{ 
    struct database employee; 
    employee.id=1; 
    employee.age=23; 
    employee.salary=45678.90; 
    /* 
    How can i print this value as an integer 
    (with out changing the salary data type in the declaration part) ? 
    */ 
    cout<<endl<<employee.id<<endl<<employee.age<<endl<<employee.salary<<endl; 
    return 0; 
} 
+1

http: //www.cs.tut.fi/~ jkorpela/round.html –

Trả lời

26

cách bình thường là:

float f = 3.4; 
int n = static_cast<int>(f); 
+8

Thông tin bổ sung về kết quả sẽ hữu ích. – ManuelSchneid3r

25

gì bạn đang tìm kiếm là 'loại đúc'. typecasting (đặt loại bạn biết bạn muốn trong dấu ngoặc) cho trình biên dịch biết bạn đang làm gì và làm mát với nó. Cách cũ được thừa hưởng từ C là như sau.

float var_a = 9.99; 
int var_b = (int)var_a; 

Nếu bạn đã chỉ cố gắng viết

int var_b = var_a; 

Bạn sẽ nhận được một cảnh báo rằng bạn không thể mặc nhiên (tự động) chuyển đổi một float một int, như bạn bị mất những thập phân.

Điều này được gọi là cách cũ như C++ cung cấp giải pháp thay thế cao cấp, 'diễn viên tĩnh'; điều này cung cấp một cách an toàn hơn nhiều để chuyển đổi từ kiểu này sang loại khác. Phương pháp tương đương sẽ là (và cách bạn nên làm điều đó)

float var_x = 9.99; 
int var_y = static_cast<int>(var_x); 

Phương pháp này có thể trông hơi dài hơn hơi, nhưng nó cung cấp xử lý tốt hơn nhiều cho các tình huống như vô tình yêu cầu một 'diễn viên tĩnh' trên loại không thể chuyển đổi. Để biết thêm thông tin về lý do bạn nên sử dụng dàn diễn viên tĩnh, hãy xem this question.

+1

Tôi không nhận được phiếu bầu xuống? quan tâm để đưa ra một lý do? – thecoshman

+2

Tôi đã không downvote, nhưng nó có thể là do bạn sử dụng C phong cách phôi trong mã C + +. Nó cau mày vì nó là phong cách xấu – Glen

+0

Tôi? có thật không? xin lỗi, đó là cách tôi mặc dù tôi đã có nghĩa là để làm cho họ – thecoshman

0

Tôi tin rằng bạn có thể làm điều này bằng một dàn diễn viên:

float f_val = 3.6f; 
int i_val = (int) f_val; 
0

kỹ thuật đơn giản nhất là chỉ cần gán float để int, ví dụ:

int i; 
float f; 
f = 34.0098; 
i = f; 

này sẽ cắt tất cả mọi thứ đằng sau dấu chấm động hay bạn có thể làm tròn số phao của bạn trước đây.

9

Kích thước của một số loại phao có thể vượt quá kích thước int. Ví dụ này cho thấy một sự chuyển đổi an toàn của bất kỳ loại phao để int bằng cách sử dụng chức năng int safeFloatToInt(const FloatType &num);:

#include <iostream> 
#include <limits> 
using namespace std; 

template <class FloatType> 
int safeFloatToInt(const FloatType &num) { 
    //check if float fits into integer 
    if (numeric_limits<int>::digits < numeric_limits<FloatType>::digits) { 
     // check if float is smaller than max int 
     if((num < static_cast<FloatType>(numeric_limits<int>::max())) && 
      (num > static_cast<FloatType>(numeric_limits<int>::min()))) { 
     return static_cast<int>(num); //safe to cast 
     } else { 
     cerr << "Unsafe conversion of value:" << num << endl; 
     //NaN is not defined for int return the largest int value 
     return numeric_limits<int>::max(); 
     } 
    } else { 
     //It is safe to cast 
     return static_cast<int>(num); 
    } 
} 
int main(){ 
    double a=2251799813685240.0; 
    float b=43.0; 
    double c=23333.0; 
    //unsafe cast 
    cout << safeFloatToInt(a) << endl; 
    cout << safeFloatToInt(b) << endl; 
    cout << safeFloatToInt(c) << endl; 
    return 0; 
} 

Kết quả:

Unsafe conversion of value:2.2518e+15 
2147483647 
43 
23333 
+0

không biên dịch ở tất cả (cxx11) – dgrat

3

Kiểm tra việc tăng NumericConversion thư viện. Nó sẽ cho phép kiểm soát rõ ràng cách bạn muốn xử lý các vấn đề như xử lý tràn và cắt xén.

0

Một điều tôi muốn thêm. Đôi khi, có thể bị mất chính xác. Bạn có thể muốn thêm một số giá trị epsilon trước khi chuyển đổi. Không chắc tại sao nó lại hoạt động ... nhưng nó hoạt động.

int someint = (somedouble+epsilon); 
2

Đối với hầu hết các trường hợp (dài cho phao, lâu dài cho đôi và dài gấp đôi):

long a{ std::lround(1.5f) }; //2l 
long long b{ std::llround(std::floor(1.5)) }; //1ll 
Các vấn đề liên quan