java整数舍入(与除法相关)

java整数舍入(与除法相关),java,integer,rounding,division,truncation,Java,Integer,Rounding,Division,Truncation,我遇到了一个意外,整数除法并没有像预期的那样四舍五入 简单代码: public class HelloMath { public static void main(String[] args) { for (int s=1; s< 20; s++) { int div = 1<<s; int res = (int) ((float)-8/ s); System.ou

我遇到了一个意外,整数除法并没有像预期的那样四舍五入

简单代码:

public class HelloMath {

    public static void main(String[] args) {
        for (int s=1; s< 20; s++)
        {
            int div = 1<<s;
            int res = (int) ((float)-8/ s);
            System.out.printf("Bit %d, result %d\n", s, res);
        }
    }

}
我一直在期待-1

发生这种情况的真实代码是这样做的:

public static int fluidTo8th(int fluid)
{
    if (0 == fluid)
        return 0;   // Technically, this isn't needed :-).
    int wholePart = (fluid-1) * 8 / RealisticFluids.MAX_FLUID; // -1 gets rounding correct;
    // consider fluid of exactly 1/8th.
    return 1+wholePart;
}
RealisticFluids.MAX_流体的值为(1 我希望整数数学能把所有分数取整

首先,你不是在做整数除法:你是在做浮点除法。
(float)-8
是一个浮点表达式。因此,
(float)-8/s
中的
s
在除法发生之前被提升为(float)


然后浮点结果被转换成整数。Reuseman说整数除法向零舍入。嗯,float->int转换也向零舍入。

如果你真的用
div而不是
s
除法,结果可能会不同。我的意思是,我想,你创建
div
是有原因的。When
s=1
,将-8除以
s
等于-8,将-8除以
div
(支持您的语句的1Java规范:…浮点值四舍五入为整数值V,使用IEEE 754向零舍入模式()向零舍入()。
public static int fluidTo8th(int fluid)
{
    if (0 == fluid)
        return 0;   // Technically, this isn't needed :-).
    int wholePart = (fluid-1) * 8 / RealisticFluids.MAX_FLUID; // -1 gets rounding correct;
    // consider fluid of exactly 1/8th.
    return 1+wholePart;
}