2016-05-18 4 views
1

Javaの整数除算を使用しようとしていて、床がかかると思われます。ただし、床の代わりにゼロに向かって丸くなります。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)でこれを解決しようとしています。私が持っているものは:

ダブル/フロートなしでこれを行うにはどうすればいいですか?

+0

'int 'のいずれかを' double'にキャストすることについては、効率的ではありません。 – Zircon

答えて

2

絶対値をとり、それに-1を掛けます。

奇妙なバグ。

+7

これはバグではなく、商/剰余を計算するための複数の方法が存在します。 -1に向かうものはユークリッド部門ですが、Javaは切り捨てられた部門を使います。 – Jack

+0

'-1/4'のようなものでは動作しません。私が-1を望むとき、それは0を与える – AMACB

0

あなたはそれはあなたが(キャストが大きな計算コストを持っていない)precissionの紛失がなく、パフォーマンスの問題もなくintにキャストすることができますdouble値も

を返します

int i = (int) Math.round(doubleValToRound); 

を使用することができます

int a = (int) (doubleValToRound + 0.5); 
//in your case 
System.out.println((int) ((-1/100) + 0.5)); 

この最後のものでは、退屈で不必要な「if」命令に入る必要はありませんs。良いスーツのように、その瞬間ごとに有効で、他の言語の移植性が高い

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

ちょうど2つの整数を除算します。結果に-1を加えます(分子と分母の絶対値が同じでない場合)。たとえば、-3/3は-1を返し、-1を除いて正解とします。

1

floorDiv()からJava.あなたが望むものを正確に実行します。

static long floorDiv(long x, long y) 

は代数商以下の最大(正の無限大に最も近い)長い値を返します。少し遅れて以来

0

が、あなたは長いまたはにパラメータを変換する必要があり、二重

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

これは、エレガントな私のために働きました。