使用 C++,我尝试使用这些指令将 float
值转换为 int
:
#include <iostream>
int main() {
float NbrToCast = 1.8f;
int TmpNbr = NbrToCast * 10;
std::cout << TmpNbr << "\n";
}
我了解值 1.8
不能精确表示为 float
,实际上存储为 1.79999995
。
因此,我希望将此值乘以 10,将得到 17.99999995
,然后将其转换为 int
将得到 17
.
在 Windows 7 上使用 MinGW
(v4.9.2 32bits) 编译和运行这段代码时,我得到了预期的结果 (17
)。
在我的 Mac (OS X 10.11) 上使用 CLang
(v600.0.57) 编译和运行此代码时,我得到 18
结果,这不是什么我在期待,但从数学的角度来看,这似乎更正确!
为什么我会得到这种差异?
有没有一种方法可以使无论操作系统还是编译器都具有一致的行为?
最佳答案
正如 Yuushi 在评论中所说,我猜每个编译器的舍入规则可能不同。拥有关于此类主题的可移植解决方案可能意味着您需要编写自己的舍入方法。
因此,在您的情况下,您可能需要检查 7 之后数字的值并是否增加该值。让我们这样说:
int main() {
float NbrToCast = 1.8f;
float TmpNbr = NbrToCast * 10;
std::cout << RoundingFloatToInt(TmpNbr) << "\n";
}
int RoundingFloatToInt(const float &val)
{
float intPart, fractPart;
fractpart = modf (val, &intpart);
int result = intPart;
if (fractpart > 0.5)
{
result++;
}
return result;
}
(代码根本没有测试,但你有想法)
如果您需要性能,它可能不是很好,但我认为它应该是可移植的。
关于c++ - 在 MinGw 和 Clang 之间将 float 转换为 int 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36884572/