19

Jakie są różne techniki używane do konwersji danych typu float na liczbę całkowitą w C++?C++ konwersja liczb zmiennoprzecinkowych na liczby całkowite

#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 –

Odpowiedz

26

normalny sposób to:

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

Dodatkowe informacje na temat wyniku byłyby pomocne. – ManuelSchneid3r

25

Co szukasz jest 'typem odlew'. typecasting (wpisanie tego, który chcesz w nawiasie), mówi kompilatorowi, że wiesz, co robisz i jesteś z nim fajny. Stary sposób odziedziczony po C jest następujący.

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

Gdybyś miał tylko próbowałem pisać

int var_b = var_a; 

Można by dostał ostrzeżenie, że nie można w sposób dorozumiany (automatycznie) przekonwertować float do int, jak tracisz po przecinku.

Jest to tak zwana stara metoda, ponieważ C++ oferuje lepszą alternatywę, "statyczną obsadę"; zapewnia to o wiele bezpieczniejszy sposób konwersji z jednego typu na inny. Równowartość metodą byłoby (i tak, jak powinien to zrobić)

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

Metoda ta może wyglądać nieco bardziej długo zdyszany, ale zapewnia znacznie lepszą obsługę w sytuacjach takich jak przypadkowo żądając „statyczny obsady” na typie, którego nie można przekonwertować. Aby uzyskać więcej informacji o tym, dlaczego powinieneś używać funkcji rzutowania statycznego, zobacz: this question.

+1

Nie dostaję głosowania w dół? czy podać powód? – thecoshman

+2

Nie spadłem, ale może to być spowodowane używaniem rzutów w stylu C w kodzie C++. Zmarszczył brwi, bo to zły styl. – Glen

+0

Jestem? naprawdę? przepraszam, tak właśnie chciałem je wykonać. – thecoshman

0

Wierzę, że można to zrobić za pomocą Obsada:

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

najprostszym sposobem jest po prostu przypisać pływaka do int, na przykład:

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

to obetnie wszystko za zmiennoprzecinkowych lub możesz zaokrąglić swój numer float wcześniej.

9

Rozmiar niektórych typów pływaków może przekraczać rozmiar int. Ten przykład pokazuje bezpieczną konwersję dowolnego typu float do int przy użyciu funkcji 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; 
} 

Wynik:

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

nie kompiluje się w ogóle (cxx11) – dgrat

3

Zapoznaj się z doładowania NumericConversion biblioteka. Pozwoli to wyraźnie kontrolować, jak chcesz rozwiązywać problemy, takie jak przepełnienie i obcięcie.

0

Jedna rzecz, którą chcę dodać. Czasami może nastąpić utrata precyzji. Przed konwersją możesz najpierw dodać wartość epsilon. Nie wiem, dlaczego to działa ... ale działa.

int someint = (somedouble+epsilon); 
2

W większości przypadków (długa dla pływaków, długo długo podwójnym i long double):

long a{ std::lround(1.5f) }; //2l 
long long b{ std::llround(std::floor(1.5)) }; //1ll 
Powiązane problemy