Java整数除法不能给出负数

时间:2016-05-18 19:12:04

标签: 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
    }
}

问题是我不想转换为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,我怎么能这样做?

7 个答案:

答案 0 :(得分:3)

来自Java.Math的

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为负数时给出正确的结果(从数学意义上来说)。