C ++浮点指向整数类型转换

时间:2010-03-30 10:24:14

标签: c++ floating-point integer type-conversion typecast-operator

在C ++中用于将float类型的数据转换为整数的不同技术是什么?

#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;
}

8 个答案:

答案 0 :(得分:45)

您正在寻找的是'铸造'。类型转换(将你想知道的类型放在括号中)告诉编译器你知道你在做什么并且很酷。从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);

这种方法可能看起来有点长,但它提供了更好的处理方式,例如在无法转换的类型上意外请求“静态强制转换”。有关使用静态强制转换的原因的详细信息,请参阅this question

答案 1 :(得分:30)

正常的方式是:

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

答案 2 :(得分:11)

某些浮点类型的大小可能超过int的大小。 此示例显示使用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

答案 3 :(得分:4)

对于大多数情况(长时间用于浮点数,长时间用于双倍和长双倍):

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

答案 4 :(得分:3)

查看boost NumericConversion库。它将允许显式控制您希望如何处理溢出处理和截断等问题。

答案 5 :(得分:0)

我相信你可以使用演员表来做到这一点:

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

答案 6 :(得分:0)

最简单的方法是将float赋值给int,例如:

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

这会截断浮点后面的所有内容,或者你可以在之前对你的浮点数进行舍入。

答案 7 :(得分:-1)

我想补充一点。有时,可能会出现精确损失。您可能希望在转换之前先添加一些epsilon值。不知道为什么这样有效......但它确实有效。

int someint = (somedouble+epsilon);