将double转换为int的结果是错误的

Mic*_*ler 5 c++ casting floating-accuracy

运行以下代码时,似乎存在某种模糊的舍入错误:

int roundedTotal = (int)(PriorityJob * 100.0);
Run Code Online (Sandbox Code Playgroud)

最初PriorityJob = 1.4并且roundedTotal未定义.PriorityJob * 100.0那时的评估给出了140.之后roundedTotal = 139.

显然,140.0被解释为139.99999.这是浮点引擎的缺陷吗?我从来没有见过这样的东西.

Mik*_*our 10

几乎每台现代计算机都使用二进制表示表示浮点数.

正如1/3 = 0.33333333...无法精确表示为小数,因此1/10(因此大多数非整数十进制值,包括1.4)不能完全表示为二进制小数.它将由最接近的可表示值表示,该值可能稍微大于或小于"真实"值.

您可能希望舍入到最接近的整数: (int)(PriorityJob * 100.0 + 0.5)

  • 并且显示值的差异出现是因为 `std::cout << PriorityJob * 100.0` 循环,而 `int roundTotal = PriorityJob * 100.0` 丢弃小数部分。 (2认同)