我试图使用java的整数除法,它应该发言。然而,它向零而不是向下舍入。
public class Main {
public static void main(String[] args) {
System.out.println(-1 / 100); // should be -1, but is 0
System.out.println(Math.floor(-1d/100d)); // correct
}
}
问题是我不想转换为double / float,因为它需要高效。我正试图用一种方法floorDivide(long a, long b)
来解决这个问题。我所拥有的是:
static long floorDivide(long a, long b) {
if (a < 0) {
// what do I put here?
}
return a / b;
}
如果没有double / float,我怎么能这样做?
答案 0 :(得分:3)
floorDiv()
完全符合您的要求。
static long floorDiv(long x, long y)
返回小于或等于代数商的最大(最接近正无穷大)长值。
答案 1 :(得分:1)
取绝对值,除以它,乘以-1。
奇怪的错误。
答案 2 :(得分:0)
您可以使用
int i = (int) Math.round(doubleValToRound);
它会返回一个double
值,您可以将其转换为int
而不会丢失精确度并且不会出现性能问题(投射天堂并计算成本很高)
它也相当于
int a = (int) (doubleValToRound + 0.5);
//in your case
System.out.println((int) ((-1 / 100) + 0.5));
有了这最后一个,你不必进入乏味和不必要的&#34;如果&#34;说明。就像一件好西装一样,它适用于每一刻,并且具有更高的其他语言可移植性。
答案 3 :(得分:0)
这很难看,但符合不使用double / float的要求。真的,你应该把它变成双倍。
如果它没有均匀分配,那么这里的逻辑就是整数除法的负结果。
static long floorDivide(long a, long b)
{
if(a % b != 0 && ((a < 0 && b > 0) || (a > 0 && b < 0)))
{
return (a / b - 1);
}
else
{
return (a / b);
}
}
答案 4 :(得分:0)
除了两个整数。然后在结果中加上-1(如果分子和分母的绝对值不相同)。例如-3-3给你-1,正确答案而不向分区添加-1。
答案 5 :(得分:0)
由于时间晚了,但您需要将参数转换为长或加倍
int result = (int) Math.floor( (double) -1 / 5 );
// result == -1
这对我很有帮助。
答案 6 :(得分:0)
正如弗兰克·哈珀(Frank Harper)建议的那样,在一般情况下,我会使用floorDiv()
。
但是,请注意,当除数为2的幂时,除法通常由右移替换适当数量的位,即
x / d
与
相同x >> p
当p = 0,1,...,30(或长为0,1,...,62)时,d = 2 p ,并且x为非负数。这不仅比普通除法更有效,而且在x为负数时给出正确的结果(从数学意义上来说)。