c++改变了从double到int的隐式转换

c++ changing implicit conversion from double to int

本文关键字:转换 int 改变 double c++      更新时间:2023-10-16

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

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

从double到int的隐式转换是截断,这意味着5.78将被保存为5。然而,它已经决定改变这种行为与自定义四舍五入。

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

有什么简单的方法可以改变double到int的转换行为,这会影响整个代码

您可以使用统一的初始化语法来禁止窄化转换:

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/链接器错误的土地。或者在无声地呼唤不同的超载土地。
  • 可能更多。

这样做:

#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类)并重载=操作符来进行正确的转换。