c++改变了从double到int的隐式转换
c++ changing implicit conversion from double to int
我的代码有很多从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
类)并重载=
操作符来进行正确的转换。
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 将 int 数组转换为 std::vector<int*>
- 如何转换 int 变量并附加到常量 wchar_t*
- 类型转换<int>的舍入问题
- 在Objective-C中调用sqlite3数据库时,如何调用和转换int/NSNumber
- 转换 int -> 无符号长 长 是否由标准定义
- 简单的 int 到字符串转换..int to const char* 无效
- 如何将转换 int 除法键入为浮点数
- C++类型转换 int * 到类
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 转换int并将其与char*连接
- 字符串流在转换int型时添加新行
- 转换int为字符串/char c++ /Arduino
- c# P-Invoke:如何转换INT fun(BYTE *bStream, UINT16 *nCount, const
- 类型转换(int**)和int(*)的区别
- 从"int"到"nodeType"的无效转换<int>
- 从无符号int构造对强制转换int的引用