为什么 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
和浮点除法(至少一个参数是float
,double
或decimal
).
这不是舍入而是截断浮点数的整数运算,所以
(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
根据我的计算器:(100-1) / 2 = 49.5
如果我有这样的整数:
int mid = (100 - 1) / 2
打印 mid 会给我:
49
为什么 C# 会给我 49 而不是 50?如果它是 .5,你不应该四舍五入到下一个整数,这样这个数字就是 50 了吗?
当执行整数除法(我们的意思是两个参数都是整数类型)时,CLR 将截断 结果;有效地四舍五入以获得积极的结果。
如果你想要"standard"或中点舍入,你需要显式使用Math.Round
和浮点除法(至少一个参数是float
,double
或decimal
).
这不是舍入而是截断浮点数的整数运算,所以
(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