在MinGw和Clang中将float转换为int不一致

时间:2016-04-27 08:39:37

标签: c++ casting floating-point

使用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 32位)编译和运行此代码时,我得到了预期的结果(17)。

在我的Mac(OS X 10.11)上使用CLang(v600.0.57)编译和运行此代码时,我得到18,这不是我所期待的但似乎更多正确以数学方式!

为什么我会得到这种差异?

无论操作系统还是编译器,都有办法保持一致的行为吗?

1 个答案:

答案 0 :(得分:-1)

与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;
}

(代码没有经过测试,但你有想法)

如果你需要表现,它可能不是很好,但我认为它应该是可移植的。