为什么 C# 将 (100-1)/2 舍入为 49 而不是 50?

Why does C# round (100-1)/2 to 49 instead of 50?

根据我的计算器:(100-1) / 2 = 49.5

如果我有这样的整数:

int mid = (100 - 1) / 2

打印 mid 会给我:

49

为什么 C# 会给我 49 而不是 50?如果它是 .5,你不应该四舍五入到下一个整数,这样这个数字就是 50 了吗?

当执行整数除法(我们的意思是两个参数都是整数类型)时,CLR 将截断 结果;有效地四舍五入以获得积极的结果。

如果你想要"standard"或中点舍入,你需要显式使用Math.Round和浮点除法(至少一个参数是floatdoubledecimal).

这不是舍入而是截断浮点数的整数运算,所以

(100 - 1) / 2 == 99 / 2 = 49.5 which truncates to 49

(100 - 1) / -2 = 99 / -2 = -49.5 which truncates to -49

如果您想要真正的舍入,则必须至少将其中一个变量设为浮点值,然后对结果调用 Math.Round

正如其他人提到的,整数除法会被截断。这是有道理的,因为 99 % 2 == 1 并且您希望从原始值中减去模数不会改变除法结果,即 (99/2 == (99-(99%2))/2),所以99/2 = 98/2