3

操作如下:

public float InfectionPercent()
{
    return (infected + zombies) * 100 / population;
}

这些值为:

int infected = 20196093
int zombies = 1978138
int population = 32608521

返回的值为-63

更改100100f解决此问题。


为什么该操作返回-63而不是返回63

4

4 回答 4

8
20196093 + 1978138 = 22174231
22174231 * 100 = 2 217 423 100

但是, Int.MaxValue 是2 147 483 647,因此您正在破坏最大值。

通过设置100为 a float,您将强制进行浮点乘法。有效值float介于-3.4 × 10^38和之间+3.4 × 10^38(即 340 undecillion,即很多),因此它确实是正确的。

于 2013-08-01T16:15:13.783 回答
3

这是一个整数溢出错误

2,147,483,647是最大 c# 整数值

20,196,093 + 1,978,138 = 22,174,231

22,174,231 * 100 = 22,174,231 * 100 = 2,217,423,100

(整数溢出到-2,077,544,195

-2,077,544,195 / 32,608,521 = -63.71169655318007

转换为浮点数可以防止这个问题,因为浮点数不会长时间溢出,并且当它溢出时它最终会是无限的。

于 2013-08-01T16:20:06.603 回答
1

解决该问题的方法是像使用一样强制浮点乘法100f(原因由 Pierre-Luc Pineault 解释)。但是,如果您希望在不显式转换的情况下返回整数结果,请将您的变量uint设为正数。

uint infected = 20196093
uint zombies = 1978138
uint population = 32608521

public uint InfectionPercent()
{
    return (infected + zombies) * 100 / population;
}

//output is 68 (float output is 68.00134)

可能不是瓶颈,但如果它是一款实时游戏,您可能会获得更好的性能,因为您避免了 to 的转换intfloat当然,这可能是一个微优化,具体取决于您调用它的频率)。

编辑-正如克里斯在评论中正确提到的那样,最好在这种情况下使用long而不是。uint

于 2013-08-01T16:18:23.147 回答
0

整数可以容纳的最大数字是 2,147,483,647。如果你的变量受感染和僵尸都是整数,它们会超过这个数字,因为 {(infected + zombies) * 100} = 2,217,423,100 > 2,147,483,647。因为它最大化了整数,所以变成了负数。尝试将受感染和僵尸变量变为浮点数或通过将 100 变为 100.00 来强制浮点乘法。

于 2013-08-01T16:16:35.520 回答