[英]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。
因為有點晚了,但是您需要將參數轉換為long或double
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.