c ++将隐式转换从double更改为int

时间:2016-10-20 17:42:55

标签: c++ type-conversion

我的代码有很多从double到int的转换。代码可以看作是

double n = 5.78;
int d = n; // double implicitly converted to a int

从double到int的隐式转换是截断的转换,这意味着5.78将保存为5。但是,已决定使用自定义舍入来更改此行为。

解决此类问题的一种方法是拥有自己的DOUBLE和INT数据类型并使用转换运算符,但我的代码很大,我不允许做太多更改。我想到的另一种方法是在每个数字中加0.5,但唉,代码很大,而且我的变化太大了。

什么是一种简单的方法来改变影响整个代码的双向转换行为。

2 个答案:

答案 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

问题:

  • 如果你不小心改变了标准库中的定义 - 你在UB-land中
  • 如果您更改main的返回类型 - 您在UB-land
  • 如果您更改了函数的定义但未更改它的前向声明 - 您将在UB /链接器错误域中更改。或者在默默呼唤 - 不同 - 超载 - 土地。
  • 可能更多。

答案 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类)并重载=运算符以进行正确的转换。