Плавающая точка C++ к преобразованиям целого типа

Что различные методы используются для преобразования типа плавающего данных к целому числу в C++?

#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;
}
28
задан 7 revs, 5 users 33% 23 September 2019 в 10:56
поделиться

6 ответов

Размер некоторых типов float может превышать размер int. Этот пример показывает безопасное преобразование любого типа float в int с помощью функции 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;
}

Результат:

Unsafe conversion of value:2.2518e+15
2147483647
43
23333
12
ответ дан 28 November 2019 в 02:21
поделиться

Самый простой способ - просто присвоить float int, например:

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

это обрежет все, что находится за плавающей запятой, или вы можете округлить свое число с плавающей запятой раньше.

0
ответ дан 28 November 2019 в 02:21
поделиться

Оцените повышение Библиотека NumericConversion . Это позволит явно контролировать, как вы хотите решать такие проблемы, как обработка переполнения и усечение.

3
ответ дан 28 November 2019 в 02:21
поделиться

Я считаю, что вы можете сделать это с помощью преобразования:

float f_val = 3.6f;
int i_val = (int) f_val;
0
ответ дан 28 November 2019 в 02:21
поделиться

Обычный способ:

float f = 3.4;
int n = static_cast<int>(f);
30
ответ дан 28 November 2019 в 02:21
поделиться

То, что вы ищете, - это «приведение типов». приведение типов (поместив в скобки нужный вам известный тип) сообщает компилятору, что вы знаете, что делаете, и хорошо с этим справляетесь. Старый способ, унаследованный от C, выглядит следующим образом.

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

Если бы вы только попытались написать

int var_b = var_a;

, вы бы получили предупреждение о том, что вы не можете неявно (автоматически) преобразовать float в int , так как вы проиграете десятичный.

Это называется старым способом, поскольку C ++ предлагает превосходную альтернативу «статическое приведение»; это обеспечивает более безопасный способ преобразования одного типа в другой. Эквивалентный метод будет (и то, как вы должны это делать)

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

Этот метод может выглядеть немного более затянутым, но он обеспечивает гораздо лучшую обработку в таких ситуациях, как случайный запрос «статического преобразования» для типа это не может быть преобразовано. Для получения дополнительной информации о том, почему вам следует использовать статическое приведение, см. этот вопрос .

49
ответ дан 28 November 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: