在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;
}
答案 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);