如果我运行以下内容:
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%
为什么会这样?
答案 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;
其中value
和total
都是整数。
如果你需要更高的精确度(比如10),可以考虑用数千或者分解为浮点数:
float percent = (1000 * value / total) / 10f;
假设您的问题域中的1000 *值不会溢出。