Java整数除法不';不要给负数留余地

Java整数除法不';不要给负数留余地,java,integer,floor,Java,Integer,Floor,我试着使用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 } } 问题是我不想转换为双精度/

我试着使用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
    }
}
问题是我不想转换为双精度/浮点型,因为它需要高效。我试图用一种方法来解决这个问题,
floorvide(长a,长b)
。我得到的是:

static long floorDivide(long a, long b) {
    if (a < 0) {
        // what do I put here?
    }
    return a / b;
}
静态长地板视频(长a、长b){
if(a<0){
//我在这里放什么?
}
返回a/b;
}

如果没有双精度浮点运算,我怎么做呢?

取绝对值,除以它,再乘以-1

奇怪的虫子

您可以使用

  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));

有了这最后一个,你就不必进入枯燥和不必要的“如果”指令。就像一套好衣服一样,它对任何时刻都有效,对其他语言具有更高的可移植性。

这很难看,但满足了不使用双精度/浮点型的要求。真的,你应该把它投到一个双位

这里的逻辑是,如果整型除法不能平均除法,则从整型除法得到负结果

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);
    }
}
静态长地板视频(长a、长b)
{
如果(a%b!=0&&((a<0&&b>0)| |(a>0&&b<0)))
{
返回(a/b-1);
}
其他的
{
返回(a/b);
}
}

只需将这两个整数除以即可。然后在结果中加-1(如果分子和分母的绝对值不相同)。例如,-3/3给出了-1,这是正确的答案,而不需要在除法中加-1。

来自Java.Math,这正是您想要的

返回小于或等于代数商的最大(最接近正无穷大)长值


因为有点晚了,但您需要将参数转换为longdouble

int result = (int) Math.floor( (double) -1 / 5 );
// result == -1
这对我来说非常有用。

正如弗兰克·哈珀所建议的,我会用在一般情况下

然而,请注意,当除数是2的幂时,除法通常由适当位数的右移位代替,即

x / d

x >> p

当p=0,1,…,30(或0,1,…,62表示长)时,d=2p,x为非负。这不仅比普通除法更有效,而且在x为负数时(从数学意义上讲)会给出正确的结果。

将一个
整数
转换为
双整数
并没有什么效率低下的地方。这不是一个错误,存在多种计算商/余数的方法。向-1四舍五入的是欧几里德除法,而Java使用的是截断除法。当我想要-1时,它给出0
x >> p