操作如下:
public float InfectionPercent()
{
return (infected + zombies) * 100 / population;
}
这些值为:
int infected = 20196093
int zombies = 1978138
int population = 32608521
返回的值为-63
更改100
以100f
解决此问题。
为什么该操作返回-63
而不是返回63
?
操作如下:
public float InfectionPercent()
{
return (infected + zombies) * 100 / population;
}
这些值为:
int infected = 20196093
int zombies = 1978138
int population = 32608521
返回的值为-63
更改100
以100f
解决此问题。
为什么该操作返回-63
而不是返回63
?
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,即很多),因此它确实是正确的。
这是一个整数溢出错误
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
转换为浮点数可以防止这个问题,因为浮点数不会长时间溢出,并且当它溢出时它最终会是无限的。
解决该问题的方法是像使用一样强制浮点乘法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 的转换int
(float
当然,这可能是一个微优化,具体取决于您调用它的频率)。
编辑-正如克里斯在评论中正确提到的那样,最好在这种情况下使用long
而不是。uint
整数可以容纳的最大数字是 2,147,483,647。如果你的变量受感染和僵尸都是整数,它们会超过这个数字,因为 {(infected + zombies) * 100} = 2,217,423,100 > 2,147,483,647。因为它最大化了整数,所以变成了负数。尝试将受感染和僵尸变量变为浮点数或通过将 100 变为 100.00 来强制浮点乘法。