我正在尝试做简单的数学运算。 a = 5,b = a / 2&(向上舍入),当我向上舍入时,它必须是5/2 = 3,c = b-a,3-5 = 2。我的问题,当我划分5/2并向上舍入时,我得到2而不是3为b。有人可以帮助我如何围捕并获得3分吗?感谢
int a=5;
int b=(int)Math.ceil(a/2);
int c=b-a;
System.out.println(b);
System.out.println(c);
答案 0 :(得分:4)
你应该在这一行中使用2
的浮点值而不是整数:
int b = (int) Math.ceil(a / 2f);//also you can use "2.0" or "2d" instead of "2f"
您的版本使用int
除法(生成int
值2
)和2f
常量力来使用浮点除法并提升a
值到float
(在除法后产生float
值2.5
)
可能因为Multiplicative Operators的JLS规范:
对操作数(第5.6.2节)
执行二进制数字提升
这就是numeric promotion适用于我们案例中int
和float
除法操作数的方式:
应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数: 如果任一操作数的类型为double,则另一个操作数转换为double。 否则,如果任一操作数的类型为float,则另一个操作数转换为float。
答案 1 :(得分:3)
你可以使用一个小技巧来加快速度:
int b =(a + 1) / 2;
由于你用2除以,如果数字是奇数+ 1,你将获得上舍入的精确值。如果数字为+ 1舍入,则会给出一半的预期结果。
修改强>
或者一般情况下,如果您想计算Math.ceil(a / b)
,可以使用以下公式进行计算:(a + b - 1) / b
,假设a和b为正数。