【发布时间】:2016-08-21 10:35:25
【问题描述】:
使用 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,这不是我所期望的,但似乎更多 以数学方式正确!
为什么会有这种差异?
有没有办法让操作系统或编译器保持一致的行为?
【问题讨论】:
-
试试把最后一行改成
std::cout << std::precision(20) << TmpNbr << "\n"; -
@RichardCritten:
TmpNbr是int,那么std::precision(20)的意义何在? -
IEEE-754有多个rounding rules;每个编译器使用的默认值可能不同。尝试设置舍入模式 (en.cppreference.com/w/cpp/numeric/fenv/FE_round) 看看会发生什么?
-
@Yuushi 比舍入模式的差异更可能是
FLT_EVAL_METHOD的值差异。
标签: c++ casting floating-point