C 为什么下面的等式总是四舍五入?

C 为什么下面的等式总是四舍五入?,c,C,这是一个数学问题,而不是真正的编程问题。。。 这是因为C总是向下取整吗?如果大小(单位:字节)是sizeofint的整数倍,比如2*sizeofint,它会给你这个倍数,因为sizeofint-1/sizeofint小于1。如果大小_(以_字节为单位)不是sizeofint的整数倍,则除以sizeofint的余数必须至少为一。所以sizeofint+余数-1总是>=sizeofint。所以它总是四舍五入。整数除法在C中截断,是的。i、 它是向零舍入的,而不是向下舍入的 通过添加除数-1,您可以确

这是一个数学问题,而不是真正的编程问题。。。
这是因为C总是向下取整吗?

如果大小(单位:字节)是sizeofint的整数倍,比如2*sizeofint,它会给你这个倍数,因为sizeofint-1/sizeofint小于1。如果大小_(以_字节为单位)不是sizeofint的整数倍,则除以sizeofint的余数必须至少为一。所以sizeofint+余数-1总是>=sizeofint。所以它总是四舍五入。

整数除法在C中截断,是的。i、 它是向零舍入的,而不是向下舍入的

通过添加除数-1,您可以确保任何不是除数的精确倍数的数字都被四舍五入。例如,除以3:

size = (size_in_bytes + sizeof(int) - 1) / sizeof(int);

etc

当所有参数都是int时,/运算符进行整数除法。这意味着它会像人们对数学所期望的那样,将顶部和底部分开,但它只会丢弃剩余部分。或者,换句话说,它总是向零转

使用整数除法时,sizeofint-1/sizeofint将始终小于1。从本质上说,它是你能拥有的最大值,而不是一个值。因此,将其添加到等式中,最终答案的添加量总是不太大,当向下舍入时,与将原始等式向上舍入相同


回过头来看这个答案,我意识到它在我的头脑中比在文字中更有意义。

哦,不,我在没有意识到的情况下回答了一个metashockwave问题。@Kino-我理解你的沮丧,但那可能有点刻薄。如果你对此感到困扰,也许可以在Meta上发布一篇帖子。说真的,我在没有注意到谁问了这个问题的情况下发布了这个答案。否则我就不会回答了。如果问题那么大,你可以删除你自己的答案。关于这个问题,我推荐一个元问题。这当然是一个很好的例子。请看:向0取整意味着.5或更大=>向上取整0到.4999999向下取整?向0取整意味着这一点[0,1变为0。例如,19/5==3。它根本不使用中点舍入。向零舍入意味着负数舍入:-1/2=0而不是-1。@Michel:是的,这当然是它的另一部分:Jonathan,添加评论如果你认为有重复,不要编辑OP的帖子。通过添加这样的内容来改变OP的意图是不礼貌的,如果它真的因为被愚弄而关闭,它将自动添加。@b诺兰-我同意你的观点,但乔纳森是对的-它是一个愚弄者,但原作有很多成分。小马托尼的回答最初被接受,然后被拒绝。好吧-我没有改变问题,只是添加了x-ref;我认为这尊重了问题ad按照命令粘贴海报。添加相关链接是一项经批准的活动。@Leffler只是想问Tony一个问题以澄清一个迂腐的挑剔:在C89/90中,整数除法舍入为0或负无穷大实现定义行为。C++98与添加的建议相同,即舍入为0。只有C99强制执行rou在所有情况下,都是朝着0。
 (0 + 2) / 3 == 0 (0 is an exact multiple)
 (1 + 2) / 3 == 1 (round up)
 (2 + 2) / 3 == 1 (round up)
 (3 + 2) / 3 == 2 (3 is an exact multple)