簡體   English   中英

Java整數除法不為負數提供下限

[英]Java integer division doesn't give floor for negative numbers

我試圖使用 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
    }
}

問題是我不想轉換為雙精度/浮點數,因為它需要高效。 我試圖用一種方法來解決這個問題, floorDivide(long a, long b) 我所擁有的是:

static long floorDivide(long a, long b) {
    if (a < 0) {
        // what do I put here?
    }
    return a / b;
}

如果沒有雙精度/浮點數,我怎么能做到這一點?

來自 Java.Math 的floorDiv()完全符合您的要求。

 static long floorDiv(long x, long y)

返回小於或等於代數商的最大(最接近正無窮大)long 值。

取絕對值,除以它,再乘以-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));

使用最后一個,您將不必進入乏味且不必要的“if”指令。 就像一件好的西裝,它在每一刻都有效,並且對其他語言具有更高的可移植性。

這很丑陋,但符合不使用雙精度/浮點數的要求。 真的,你應該把它轉換成雙倍。

這里的邏輯是如果整數除法不均勻,則取負結果的下限。

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

只需將兩個整數相除即可。 然后將結果加 -1(以防分子和分母的絕對值不同)。 例如 -3/3 給你 -1,正確的答案,而不是在除法上加上 -1。

因為有點晚了,但是您需要將參數轉換為longdouble

int result = (int) Math.floor( (double) -1 / 5 );
// result == -1

這對我來說很優雅。

floorDiv()建議的那樣,我會在一般情況下使用floorDiv()

但是請注意,當除數是 2 的冪時,除法通常會被右移適當的位數代替,即

x / d

是一樣的

x >> p

當 p = 0,1,...,30(或 0,1,...,62 為 long)時,d = 2 p且 x 為非負數。 這不僅比普通除法更有效,而且在 x 為負時給出正確的結果(在數學意義上)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM