我的代码有很多从double到int的转换。代码可以看作是
double n = 5.78;
int d = n; // double implicitly converted to a int
从double到int的隐式转换是截断的转换,这意味着5.78将保存为5。但是,已决定使用自定义舍入来更改此行为。
解决此类问题的一种方法是拥有自己的DOUBLE和INT数据类型并使用转换运算符,但我的代码很大,我不允许做太多更改。我想到的另一种方法是在每个数字中加0.5,但唉,代码很大,而且我的变化太大了。
什么是一种简单的方法来改变影响整个代码的双向转换行为。
答案 0 :(得分:3)
您可以使用统一初始化语法来禁止缩小转换:
double a;
int b{a}; // error
如果您不想要,可以使用std::round
功能(或其姐妹std::ceil
/ std::floor
/ std::trunc
):
int b = std::round(a);
如果你想要最小的差异变化,那么你可以做什么。但是请注意, 这是一个糟糕的解决方案 (如果可以将其命名),并且更有可能因为未定义的行为导致崩溃和刻录而不是实际解决真正的问题。
定义以您希望的方式处理转化的自定义Int
类型:
class MyInt
{
//...
};
然后在预处理器黑魔法的帮助下,用int
替换每个MyInt
的出现:
#define int MyInt
问题:
main
的返回类型 - 您在UB-land 答案 1 :(得分:1)
做这样的事情:
#include <iostream>
using namespace std;
int myConvert (double rhs)
{
int answer = (int)rhs; //do something fancier here to meet your needs
return answer;
}
int main()
{
double n = 5.78;
int d = myConvert(n);
cout << "d = " << d << endl;
return 0;
}
您可以根据需要制作myConvert
。否则,您可以为int
定义自己的类(例如myInt
类)并重载=
运算符以进行正确的转换。