c浮点向下舍入

时间:2014-03-11 19:47:22

标签: c printf rounding

如果我运行以下内容:

int tokenIdx=ERROR; //ERROR=8
tokens[tokenIdx] = 57; //tokens is of type int[]
int totalTokens = 100;
int percent = (int)((100.0 * tokens[tokenIdx])/(float)totalTokens);
printf("%d%\n",percent);

int percent2 = (int)(100.0*(tokens[tokenIdx]/(1.0*totalTokens)));
printf("%d%\n",percent2);

输出是:

57%
56%

为什么会这样?

2 个答案:

答案 0 :(得分:3)

因为5700.0和100.0都可以完全表示为浮点数,它们的比例正好是57.0。另一方面,57.0 / 100.0不能完全表示为浮动指针编号,将其乘以100.0将不会精确地生成57.0。如果它产生的略小于57.0(似乎是这种情况),那么转换为截断的(int)将产生整数56.

答案 1 :(得分:0)

浮点舍入错误。在你的第一种情况下,你做的是双倍除以浮动,在第二种情况下,它是双倍除以双倍。 int转换丢弃小数部分,在第二种情况下可能是.999999999998或类似的东西。

经验教训:浮点数不准确,请注意转换,注意类型

如果你真的想要一个整数百分比,请执行:

int percent = 100 * value / total;

其中valuetotal都是整数。

如果你需要更高的精确度(比如10),可以考虑用数千或者分解为浮点数:

float percent = (1000 * value / total) / 10f;

假设您的问题域中的1000 *值不会溢出。